2010-03-24 6 views

Antwort

17

Verwenden einzigartiges() die unterschiedlichen Zeilenwert zu finden. Wenn Sie weniger Zeilen haben, gibt es Duplikate. Es gibt Ihnen auch Indizes von einem Ort jedes der verschiedenen Werte. Alle anderen Zeilenindizes sind Ihre Duplikate.

x = [ 
    1 1 
    2 2 
    3 3 
    4 4 
    2 2 
    3 3 
    3 3 
    ]; 
[u,I,J] = unique(x, 'rows', 'first') 
hasDuplicates = size(u,1) < size(x,1) 
ixDupRows = setdiff(1:size(x,1), I) 
dupRowValues = x(ixDupRows,:) 
+0

+1: Dang, schlag mich um 49 Sekunden! – gnovice

+0

Kennt jemand den Algorithmus, den Matlab verwendet, um das zu berechnen? – Will

0

Lauf durch die Zeilen der Matrix, und für jedes Paar, zu testen, ob

row1 == row2

+1

Dies funktioniert, ist aber definitiv sowohl langsamer als auch ausführlicher als die andere grundlegende Option (d. H. Mit 'unique()'). – bnaul

4

Sie können die Funktionen nutzen UNIQUE und SETDIFF dies zu erreichen:

>> mat = [1 2 3; 4 5 6; 7 8 9; 7 8 9; 1 2 3]; %# Sample matrix 
>> [newmat,index] = unique(mat,'rows','first'); %# Finds indices of unique rows 
>> repeatedIndex = setdiff(1:size(mat,1),index) %# Finds indices of repeats 

repeatedIndex = 

    4  5 
+0

Sollte 'repeatedIndex' nicht' [3,4] 'sein? – AVB

+0

@AB: Nein, die vierte und fünfte Zeile von 'mat' sind Wiederholungen früherer Reihen. – gnovice

0

Sagen Sie Ihre Matrix ist M:

[S,idx1] = sortrows(M); 
idx2 = find(all(diff(S,1) == 0,2)); 
out = unique(idx1([idx2;idx2+1])); 

aus werden die doppelten Zeilenindizes wenn überhaupt enthalten.

+0

Dies funktioniert nur, wenn Ihre duplizierten Zeilen nebeneinander liegen. – gnovice

+0

Mein Fehler. Falsche Annahme ... – upperBound

+0

Nun, technisch hat das OP nie * explizit * gesagt, ob die duplizierten Zeilen aneinander liegen oder nicht. Obwohl nicht so allgemein wie die Verwendung von UNIQUE, läuft diese Lösung im speziellen Fall benachbarter Duplikate * wesentlich * schneller, also +1. – gnovice

Verwandte Themen