如何在matlab中删除矩阵每一行中多余的重复元素?

How to remove extra duplicated elements in each row of a matrix in matlab?

假设我有一个矩阵

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

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

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

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

[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