2010-03-24 13 views

Répondre

17

utilisation pour trouver les valeurs des lignes distinctes uniques(). Si vous vous retrouvez avec moins de lignes, il y a des doublons. Il vous donnera également des index d'un emplacement de chacune des valeurs distinctes. Tous les autres index de ligne sont vos doublons.

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, battu moi de 49 secondes! – gnovice

+0

Est-ce que quelqu'un connaît l'algorithme utilisé par Matlab pour calculer cela? – Will

0

Run à travers les lignes de la matrice, et pour chaque paire, test si

row1 == row2

+1

Cela fonctionne, mais est certainement à la fois plus lent et plus prolixe que l'autre option de base (c'est-à-dire en utilisant 'unique()'). – bnaul

4

Vous pouvez utiliser les fonctions UNIQUE et SETDIFF pour ce faire:

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

Le paramètre '' repeatIndex'' ne devrait-il pas être '[3,4]'? – AVB

+0

@AB: Non, les quatrième et cinquième lignes de 'mat' sont des répétitions de lignes précédentes. – gnovice

0

Supposons que votre matrice est M:

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

sur contiendra les indices de lignes en double le cas échéant.

+0

Cela ne fonctionnera que si vos lignes dupliquées sont les unes à côté des autres. – gnovice

+0

Mon erreur. Mauvaise hypothèse ... – upperBound

+0

Eh bien, techniquement, l'OP n'a jamais * explicitement * dit si oui ou non les lignes dupliquées sont contiguës. Bien que pas aussi général que l'utilisation de UNIQUE, cette solution s'exécute * sensiblement * plus rapidement dans le cas spécifique de doublons voisins, donc +1. – gnovice