比方说,我有一个矩阵如何在matlab中的矩阵的每一行中删除多余的重复元素?
A = [2 3 2 5 6 7 2;
1 2 5 4 5 6 7;
7 5 3 9 8 1 2];
如何在第二行中删除2
S和保持一个2
第一排,只保留一个5
?
比方说,我有一个矩阵如何在matlab中的矩阵的每一行中删除多余的重复元素?
A = [2 3 2 5 6 7 2;
1 2 5 4 5 6 7;
7 5 3 9 8 1 2];
如何在第二行中删除2
S和保持一个2
第一排,只保留一个5
?
如果你想找出这些值在行内是重复的,你可以这样做:
[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
谢谢。这是我想要的, – Gaze
结果不能再是矩阵,因为每一行都有不同的长度。作为行的单元阵列载体可以按如下方式获得结果:
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
谢谢你的回答。这是一个很好的代码,但我更愿意将它保留为矩阵而不是行向量。我会采取丹曼的回答。祝你有个愉快的日子 – Gaze
@Gaze当然!我不确定你想要什么。祝你有美好的一天! –
结果不能再是矩阵,因为每一行都有不同的长度。你想要哪种类型的结果?行向量的单元格数组? –