2016-04-29 9 views

Antwort

1

Wenn Sie herausfinden möchten, Welche Werte Duplikate innerhalb der Zeile sind, können Sie etwas tun:

[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 

Von dort kommt es, was Ergebnis die Sie suchen. Sie könnten die Duplikate zu NaN oder einen anderen Wert festgelegt, oder Sie sie auf NaN setzen konnte, aber sie dann bis zum Ende der Zeile verschieben, so etwas wie die folgenden verwenden:

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

Danke. Das ist was ich wollte, – Gaze

4

Das Ergebnis kann keine Matrix mehr sein, da jede Zeile eine andere Länge hat. Sie können das Ergebnis erhalten, wie ein Zellenfeld Reihe Vektoren wie folgt:

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 

Für Ihr Beispiel Matrix

A = [2 3 2 5 6 7 2; 
    1 2 5 4 5 6 7; 
    7 5 3 9 8 1 2]; 

das gibt

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

Vielen Dank für Ihre Antwort. Es ist ein netter Code, aber ich bevorzuge es als Matrix und nicht als Zeilenvektoren. Ich werde dan-man antwort nehmen. Einen schönen Tag noch haben – Gaze

+0

@Gaze Natürlich! Ich war mir nicht sicher, was du wolltest. Haben Sie auch einen schönen Tag! –

Verwandte Themen