2010-03-24 10 views

Respuesta

17

uso único() para encontrar los valores de las filas distintas. Si termina con menos filas, hay duplicados. También le dará índices de una ubicación de cada uno de los valores distintos. Todos los demás índices de fila son sus duplicados.

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, vencerme por 49 segundos! – gnovice

+0

¿Alguien sabe el algoritmo que Matlab usa para calcular esto? – Will

0

Ejecutar a través de las filas de la matriz, y para cada par, prueba si

row1 == row2

+1

Esto funciona, pero definitivamente es más lento y más detallado que la otra opción básica (es decir, usando 'unique()'). – bnaul

4

Puede utilizar las funciones UNIQUE y SETDIFF para lograr esto:

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

¿No debería 'repeatIndex' ser' [3,4] '? – AVB

+0

@AB: No, la cuarta y quinta filas de 'mat' son repeticiones de filas anteriores. – gnovice

0

Digamos que su matriz es M:

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

cabo contendrá los índices de fila duplicados si los hubiere.

+0

Esto solo funcionará si sus filas duplicadas están una al lado de la otra. – gnovice

+0

Mi error. Asunción errónea ... – upperBound

+0

Bueno, técnicamente el OP nunca * explícitamente * dijo si las filas duplicadas colisionan entre sí o no. Aunque no es tan general como el uso de UNIQUE, esta solución se ejecuta * sustancialmente * más rápido en el caso específico de los duplicados vecinos, por lo que +1. – gnovice

Cuestiones relacionadas