【问题标题】:How to remove extra duplicated elements in each row of a matrix in matlab?如何在matlab中删除矩阵每一行中多余的重复元素?
【发布时间】:2016-08-24 13:56:49
【问题描述】:

假设我有一个矩阵

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

如何删除2s,在第一行保留一个2,在第二行只保留一个5

【问题讨论】:

  • 结果不能再是矩阵了,因为每一行都有不同的长度。您想要哪种类型的结果?行向量元胞数组?

标签: arrays matlab matrix jagged-arrays


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。这是一个很好的代码,但我更喜欢将其保留为矩阵而不是行向量。我会接受dan-man的回答。祝你有美好的一天
  • @Gaze 当然!我不确定你想要什么。也有美好的一天!
【解决方案2】:

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

[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

【讨论】:

  • 谢谢。这就是我想要的,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多