我们说我有一个矩阵
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
?
答案 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