比方說,我有一個矩陣如何在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當然!我不確定你想要什麼。祝你有美好的一天! –
結果不能再是矩陣,因爲每一行都有不同的長度。你想要哪種類型的結果?行向量的單元格數組? –