How can I find and remove the nonzero duplicates in each column of a matrix

2 次查看(过去 30 天)
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 个评论
Image Analyst
Image Analyst 2016-7-4
编辑:Image Analyst 2016-7-4
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?
Matt Talebi
Matt Talebi 2016-7-6
编辑:per isakson 2016-7-6
The number of duplicates in each column is either 1 or none. Also the duplicate, if exists, is always the same integer as the column number. Example:
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 ];
As can be seen in the 3rd column, 3 is a duplicate. Also in my real data set, the first row is always the column number (similar to this example). If it's not too much to ask I want Y to be:
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 ];
where duplicates removed by shifting one element up and adding two zeros at the end to balance the matrix (the order of numbers should be preserved). Otherwise, I think it should be still fine for me to be able to just identify columns with duplicate and then remove them manually. Thank you for your time!

请先登录,再进行评论。

采纳的回答

per isakson
per isakson 2016-7-6
编辑:per isakson 2016-7-6
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.
&nbsp
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 个评论
Matt Talebi
Matt Talebi 2016-7-6
Thanks Per, it works flawlessly! Just as a minor modification can you possibly modify the codes such that, once a duplicate detected in a column, keep the one in the first row and only remove the other one (to preserve the column numbers).

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by