2009-06-02 44 views
14

Tengo dos matrices xey, ambos son resultados de diferentes algoritmos/rutinas que se supone que calculan el mismo resultado. Aunque sé que isequal() verificaría si xey son la misma matriz, las entradas en esas matrices no serían exactamente las mismas (es decir, algunas entradas pueden tener un 5% de descuento en el peor de los casos). En este escenario, ¿cuál sería el mejor método de compararlos para ver si están lo suficientemente cerca como para considerar el mismo resultado? Gracias de antemano por los consejos.Comparando dos matrices en Matlab

+1

Esta pregunta es bastante viejo, pero matemáticamente que se quiere usar 'norma (A-B)/norma (A)', no las soluciones a continuación. – rlbond

Respuesta

5

Modificación Edric's solución:

absTol = 1e-3; % You choose this value to be what you want! 
relTol = 0.05; % This one too! 
absError = x(:)-y(:); 
relError = absError./x(:); 
relError(~isfinite(relError)) = 0; % Sets Inf and NaN to 0 
same = all((abs(absError) < absTol) & (abs(relError) < relTol)); 

El variable mismo será falso si absoluto o el error relativo de cualquier elemento es mayor que las tolerancias que elija. Además, si algún elemento de x resulta ser exactamente 0, entonces algunos de los elementos de relError podrían terminar siendo infinitos o no, por lo que utilicé la función ISFINITE para ignorar esos valores configurándolos a 0.

No recomendaría usar IMAGESC para comparar gráficos, ya que 1) los datos se escalan cuando se muestran, 2) el mapa de colores para la pantalla tiene un número discreto de valores de color (que creo que es 256 por defecto, por lo tanto, muchos redondeos), y 3) variaciones sutiles en el color pueden no ser tan evidentes a partir de la comparación visual de dos parcelas.

13

Prueba esto:

tf = abs((A-B)./B)<0.05 

Esto devolverá una matriz lógica que será cierto para cada elemento si la diferencia relativa entre A y B con respecto a B es de menos de 5 por ciento.

Si desea preguntar si todo esto es cierto (todos ellos satisfacen la condición anterior):

all(tf(:)) 
+0

una mejor respuesta de lo que realmente menciono. – bastijn

+1

¿No necesita un valor absoluto aquí en alguna parte? – Jim

+0

Sí, lo he agregado ahora. Gracias. –

4

yo consideraría hacer algo como esto con una tolerancia absoluta, así como una tolerancia relativa:

function same = tol(x, y) 
absTol = 1e-3; 
relTol = 0.05; 
errVec = abs(x(:) - y(:)); 
same = all((errVec < absTol) | (errVec./x(:) < relTol)); 
+0

Probé tanto el método de Edric como el de Andrew.Aunque obtuve una salida de la función que es falsa, cuando comparé visualmente los dos resultados trazándolos usando la función imagesc(), se ven muy similares. Por lo tanto, todavía no estoy muy seguro de qué hacer con esto. – stanigator

1

Cuando tiene pares de valores muy pequeños en x e y, el resultado arrojaría 0 aunque los mismos valores son ignorables. Por lo tanto, una adición a la solución aceptada

relError(x < absTol) = 0;

podría utilizarse para descartar errores muy pequeños. Por lo tanto, el error relativo no se considera para estos valores.

-2

hacer uso de 'IsEqual (a, b) donde a y b son dos matrices, si 1 es cierto

+1

Tenga en cuenta que op dijo específicamente que isequal no funcionaría ya que hay un error. –

0

para las matrices x e y que contienen valores de coma flotante, se puede comprobar si los elementos de matriz están dentro de un dada tolerancia el uno del otro. código de la muestra:

tol = 0.05; 

result = abs(x - y) <= tol;