2011-10-12 23 views
5

Dadas dos matrices flotar en R, me gustaría obtener el error relativo entre cada entrada, y luego entre todos los errores buscar el máximo de todos ellos y compararlo con el 10%, es decir, MAX_ERROR <= 10%error relativo entre dos matrices

sé que el error es raltive (por cada entrada):

|v_ij(MATRIX1) - v_ij(MATRIX2)|/| v_ij(MATRIX1)| 

de cómo hacer esto en R, evitando un bucle?

Respuesta

4

Si desea manejar los casos en que la matriz tiene ceros en el mismo (que de otro modo conduce a la división por cero), esta respuesta tiene algunas soluciones: Do you reassign == and != to isTRUE(all.equal())?

Una ligera modificación de la función almostEqual me sugirió que habría Rendimiento:

relativeError <- function(x, y, tolerance=1e-8) { 
    diff <- abs(x - y) 
    mag <- pmax(abs(x), abs(y)) 
    ifelse(mag > tolerance, diff/mag, diff) 
} 

m1 <- cbind(c(0,1), c(1,1)) 
m2 <- cbind(c(0,1), c(1,1.11)) 
any(relativeError(m1, m2) > 0.01) # TRUE 

# Building on @DWin's answer: 
which(relativeError(m1, m2) > 0.01, arr.ind=TRUE) # 2 2 

Tenga en cuenta que este calcula el error relativo ligeramente diferente a su definición: es simétrica y se ocupa de los valores pequeños - y es un poco más lento a causa de ella. ..

+0

Buen trabajo. Nos acercamos a una respuesta a prueba de balas, pero flexible. –

3

El siguiente debería funcionar:

maxerr <- max(abs((a - b)/a)) 

donde a y b son las dos matrices. Para convertir el resultado en porcentaje, multiplique por 100.

4

Si wnat para identificar qué elementos de fallar la prueba a continuación, intente esto:

over_err <- which(abs(MATRIX1-MATRIX2)/abs(MATRIX1) > 0.1, arr.ind=TRUE) 

Si desea dispaly una lista de índices y valores de matriz1 que satisfacen (o dejar de satisfacer) que condicionan a continuación:

cbind(over_err, MATRIX1[over_err]) 
+1

Y si usted quiere pedir ellos, entonces simplemente use 'out <- cbind (over_err, values ​​= MATRIX1 [over_err])' y 'out [order (values, decreasing = T),]'. :-) – TMS

+0

Bueno: Y si solo quisiera los "cinco primeros", podría usar: 'fuera [orden (valores, disminución = T),] [1: 5]' –

+1

¡Bueno! :-) Pero si hay menos de 5, obtienes NA. Tal vez 'head (out [...], 5)' sería mejor (¡aunque no tan elegante!). – TMS

1

Si la matriz exacta M_exact y la matriz aproximada es M_app; a continuación, utilizando Mathematica, el porcentaje de error se puede calcular como

error(%) = 100(Norm[M_app - M_exact]/Norm[M_exact]) 

Para comprobar el error relativo en el elemento de la matriz

Relative_error = (Abs[M_app - M_exact])/Abs[M_exact] 

Para más detalles: http://www.netlib.org/lapack/lug/node75.html