J'ai une matrice rectangulaire n-by-m (n! = M). Quel est le meilleur moyen de savoir s'il y a des doublons dans MATLAB? Quelle est la meilleure façon de trouver les indices des doublons?Comment puis-je savoir si une matrice rectangulaire a des lignes dupliquées dans MATLAB?
Répondre
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,:)
Run à travers les lignes de la matrice, et pour chaque paire, test si
row1 == row2
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
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
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.
Cela ne fonctionnera que si vos lignes dupliquées sont les unes à côté des autres. – gnovice
Mon erreur. Mauvaise hypothèse ... – upperBound
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
+1: Dang, battu moi de 49 secondes! – gnovice
Est-ce que quelqu'un connaît l'algorithme utilisé par Matlab pour calculer cela? – Will