2016-04-29 457 views

回答

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 
+0

謝謝。這是我想要的, – Gaze

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 
+0

謝謝你的回答。這是一個很好的代碼,但我更願意將它保留爲矩陣而不是行向量。我會採取丹曼的回答。祝你有個愉快的日子 – Gaze

+0

@Gaze當然!我不確定你想要什麼。祝你有美好的一天! –

相關問題