2010-02-04 13 views
16

Tengo dos grandes matrices con aproximadamente 1000 filas y 1000 columnas. Necesito comparar cada elemento de estas matrices y almacenar 1 en otra matriz si los elementos correspondientes son iguales.¿Cómo comparo todos los elementos de dos matrices?

Puedo hacer esto con loops pero eso lleva mucho tiempo. ¿Cómo puedo hacer esto más rápido?

+2

Siempre, siempre vectorice el código de MATLAB cuando sea posible. – Doresoom

+0

¿Se debe mover a http://math.stackexchange.com/? – aaronsnoswell

Respuesta

12

Si sus dos matrices A y B son del mismo tamaño, entonces usted puede hacer esto:

index = A == B; 

y index habrá un logical array con queridos en todas partes un elemento de A y B son iguales y cero en caso contrario.

Una palabra de advertencia ...

Si A y B contienen números enteros, lo anterior debe estar bien. Sin embargo, si contienen valores de punto flotante, puede obtener resultados no deseados. El código anterior solo tendrá valores de uno para los elementos que son exactamente iguales. Incluso la diferencia más pequeña hará que los elementos se consideren desiguales.

Puede consultar this question's answers para obtener más información sobre cómo lidiar con los "riesgos de las operaciones de punto flotante". Una solución sería la de comprobar que array elementos se encuentran dentro de una tolerancia dada el uno del otro, así:

tolerance = 0.0001; 
index = abs(A-B) <= tolerance; 

Lo anterior le dará una matriz lógica index con queridos en todas partes de los elementos de A y B se encuentran dentro de 0,0001 de entre sí y cero de lo contrario.

+0

Matlab tiene función eps, descrita como precisión relativa de coma flotante.Puede usarlo en lugar de la variable de tolerancia en el código de gnovice. índice = abs (A-B) <= eps; – yuk

+0

eps es el valor más pequeño que se puede representar, ¿no es así? Eso no es muy útil en este contexto. –

7

sólo tiene que utilizar el operador de la normalidad ==:

>> [1 2; 3 4] == [1 5; 6 4]  

ans = 

    1  0 
    0  1 
29

Las respuestas dadas son los correctos. Solo quería detallar el comentario gnovice's sobre las pruebas de coma flotante.

Al comparar los números de coma flotante para la igualdad, es necesario usar un valor de tolerancia. Se usan comúnmente dos tipos de comparaciones de tolerancia: tolerancia absoluta y tolerancia relativa. (source)

Una comparación de tolerancia absoluta de a y b parece:

|a-b| < tol 

una comparación relativa tolerancia parece:

|a-b| < tol*max(|a|,|b|) + tol_floor 

Puede implementar las dos funciones como anónimos anteriores:

%# absolute tolerance equality 
isequalAbs = @(x,y,tol) (abs(x-y) <= tol); 

%# relative tolerance equality 
isequalRel = @(x,y,tol) (abs(x-y) <= (tol*max(abs(x),abs(y)) + eps)); 

Luego puede usarlos como:

%# let x and y be scalars/vectors/matrices of same size 
x == y 
isequalAbs(x, y, 1e-6) 
isequalRel(x, y, 1e-6) 
+0

¿Qué pasa con 'isequal'? – Jacob

+4

try: 'isequal (0.3,0.1 * 3)' que es equivalente a '0.3 == 0.1 * 3'. ¡La respuesta en ambos es falsa! – Amro

+1

Mis disculpas: ¡creo que mi fe en MATLAB estaba fuera de lugar! Voy a tener que cambiar una gran cantidad de código ahora :( – Jacob

Cuestiones relacionadas