How can I find and remove the nonzero duplicates in each column of a matrix
2 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Matt Talebi
el 4 de Jul. de 2016
Comentada: Matt Talebi
el 7 de Jul. de 2016
X is a n-by-n matrix of integers ranging from 0 to n. I want to find nonzero duplicate entries in each column and remove them.
2 comentarios
Image Analyst
el 4 de Jul. de 2016
Editada: Image Analyst
el 4 de Jul. de 2016
Unless there is exactly the same number of elements to remove in each column, you can't. For example, you can't "remove" 3 elements from column 1 and 8 elements from column 2. Can you give an example of input and output and how you used unique() to try to solve it?
Respuesta aceptada
per isakson
el 6 de Jul. de 2016
Editada: per isakson
el 6 de Jul. de 2016
Given
- "matrix of integers"
- "the first row is always the column number"
- "the duplicate, if exists, is always the same integer as the column number"
Try this
X = [ 1 2 3 4 5
2 9 5 3 8
7 5 4 0 1
6 7 3 2 0
3 1 6 7 9 ];
Y = nan( size(X) );
for jj = 1 : size( X, 2)
isdub = X( :, jj ) == jj;
if any( isdub(2:end) )
col = X(:,jj);
col( isdub ) = [];
Y(:,jj) = cat( 1, col, zeros(sum(isdub),1) );
else
Y(:,jj) = X(:,jj);
end
end
result
>> Y
Y =
1 2 5 4 5
2 9 4 3 8
7 5 6 0 1
6 7 0 2 0
3 1 0 7 9
>>
This code trades performance for readability.
 
Requirement of comment: "modify the codes ... keep the one in the first row and only remove the other one"
Y = nan( size(X) );
for jj = 1 : size( X, 2)
col = X(2:end,jj);
isdub = col == jj;
if any( isdub )
col( isdub ) = [];
Y(:,jj) = cat( 1, jj, col, zeros(sum(isdub),1) );
else
Y(:,jj) = X(:,jj);
end
end
result
>> Y
Y =
1 2 3 4 5
2 9 5 3 8
7 5 4 0 1
6 7 6 2 0
3 1 0 7 9
2 comentarios
Más respuestas (0)
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!