如何在matlab中删除矩阵每行中额外的重复元素?

时间:2016-04-29 11:55:58

标签: arrays matlab matrix jagged-arrays

我们说我有一个矩阵

A = [2 3 2 5 6 7 2; 
     1 2 5 4 5 6 7; 
     7 5 3 9 8 1 2];

如何删除2并在第一行中保留一个2并在第二行只保留一个5

2 个答案:

答案 0 :(得分:4)

结果不能再是矩阵,因为每行的长度都不同。您可以将结果作为行向量的单元格数组获取,如下所示:

B = mat2cell(A, ones(size(A,1),1)); %// convert matrix to cell array of its rows
B = cellfun(@(x) unique(x,'stable'), B, 'uniformoutput', 0); %// stably remove duplicates

对于您的示例矩阵

A = [2 3 2 5 6 7 2; 
     1 2 5 4 5 6 7; 
     7 5 3 9 8 1 2];

这给出了

B{1} =
     2     3     5     6     7
B{2} =
     1     2     5     4     6     7
B{3} =
     7     5     3     9     8     1     2

答案 1 :(得分:1)

如果你想找出行中哪些值是重复的,你可以这样做:

[vals, col_idx]  = sort(A,2);
idx = bsxfun(@plus,(col_idx-1)*size(A,1), (1:size(A,1))');
is_duplicate(idx(:,2:end)) = vals(:,1:end-1) == vals(:,2:end);
is_duplicate = reshape(is_duplicate, size(A));

is_duplicate =

 0     0     1     0     0     0     1
 0     0     0     0     1     0     0
 0     0     0     0     0     0     0

从那里,它取决于你正在寻找什么结果。您可以将重复项设置为NaN或其他值,或者您可以将它们设置为NaN,然后使用以下内容将它们转移到行尾:

col_idx = cumsum(~is_duplicate, 2);
idx = bsxfun(@plus,(col_idx-1)*size(A,1), (1:size(A,1))');
A_new = nan(size(A));
A_new(idx(~is_duplicate)) = A(~is_duplicate);

A_new =

 2     3     5     6     7   NaN   NaN
 1     2     5     4     6     7   NaN
 7     5     3     9     8     1     2