2016-01-20 17 views
6

Ich habe eine MatrixMATLAB: Erkennen und Spiegel abgebildet Paare in 2 Säulenmatrix

[1 2 
3 6 
7 1 
2 1] 

entfernen und möchten Spiegel abgebildet pairs..i.e entfernen. Ausgang wäre entweder:

[1 2 
3 6 
7 1] 

oder

[3 6 
7 1 
2 1] 

Gibt es eine einfache Möglichkeit, dies zu tun? Ich kann eine komplizierte for-Schleife, so etwas wie (oder eine Version, die die ursprünglichen pair..only die Duplikate nicht löschen würde) vorstellen:

for i=1:y 
    var1=(i,1); 
    var2=(i,2); 
    for i=1:y 
     if array(i,1)==var1 && array(i,2)==var2 | array(i,1)==var2 && array(i,2)==var1 
      array(i,1:2)=[]; 
     end 
    end 
end 

dank

+1

Beachten Sie, dass 'I' als Schleifenindex für beide Schleifen verwenden, die nicht funktionieren. Ich würde auch Vorsicht gegen [mit 'i' als Variable] argumentieren (http://stackoverflow.com/questions/14790740/using-i-and-j-as-variables-in-matlab). – Adriaan

Antwort

9

Wie ist das für Einfachheit -

A(~any(tril(squeeze(all(bsxfun(@eq,A,permute(fliplr(A),[3 2 1])),2))),2),:) 

Spielen code-golf? Nun, hier gehen wir -

A(~any(tril(pdist2(A,fliplr(A))==0),2),:) 

Wenn nur mit zwei Säulenmatrices handeln, ist hier eine einfache Version von bsxfun -

M = bsxfun(@eq,A(:,1).',A(:,2)); %//' 
out = A(~any(tril(M & M.'),2),:) 

Probelauf -

A = 
    1  2 
    3  6 
    7  1 
    6  5 
    6  3 
    2  1 
    3  4 
>> A(~any(tril(squeeze(all(bsxfun(@eq,A,permute(fliplr(A),[3 2 1])),2))),2),:) 
ans = 
    1  2 
    3  6 
    7  1 
    6  5 
    3  4 
>> A(~any(tril(pdist2(A,fliplr(A))==0),2),:) 
ans = 
    1  2 
    3  6 
    7  1 
    6  5 
    3  4 
+2

Was rauchst du? –

+6

@randomGuy 3D-Unkraut! ;) – Divakar

0

hier ein nicht so ausgefallen, aber hoffentlich verständlich und einfach.

% Example matrix 
m = [1 2; 3 6 ; 7 1; 2 1; 0 3 ; 3 0]; 

Vergleich von M mit blätterte Version, ist die Funktion ismember kehrt mirror_idx, ein 1D-Vektor mit jeder Zeile des Index der spiegel Zeile enthält, oder 0, wenn es keine gibt.

[~, mirror_idx] = ismember(m,fliplr(m),'rows'); 

Gehen Sie durch die Indizes der Spiegelreihen. Wenn Sie eine "gespiegelte" Zeile (mirror_idx > 0) finden, setzen Sie ihren Gegenpart auf "nicht gespiegelt".

for ii = 1:length(mirror_idx) 
    if (mirror_idx(ii) > 0) 
     mirror_idx(mirror_idx(ii)) = 0; 
    end 
end 

Nehmen Sie nur die Zeilen, die als keine Spiegelung markiert sind.

m_new = m(~mirror_idx,:); 

Grüße