フィルターのクリア

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

3 ビュー (過去 30 日間)
Matt Talebi
Matt Talebi 2016 年 7 月 4 日
コメント済み: Matt Talebi 2016 年 7 月 7 日
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).
Matt Talebi
Matt Talebi 2016 年 7 月 7 日
All good now, thanks a lot!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeNaNs についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by