2011-10-12 21 views
5

Dato due matrici flottanti in R, vorrei ottenere l'errore relativo tra ogni voce, quindi tra tutti gli errori cercare il massimo di tutti e confrontarlo con il 10%, ovvero MAX_ERROR <= 10%Errore relativo tra due matrici

so che l'errore è raltive (per ogni voce):

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

come farlo in R, evitando un ciclo for?

risposta

4

Se si desidera gestire i casi in cui la matrice ha zeri in esso (che altrimenti porta a una divisione per zero), questa risposta ha alcune soluzioni: Do you reassign == and != to isTRUE(all.equal())?

Una leggera modifica della funzione almostEqual ho suggerito che ci sarebbe cedere:

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 

Si noti che questo calcola l'errore relativo leggermente diverso rispetto la tua definizione: è simmetrica e gestisce i valori piccoli - ed è un po 'più lento a causa di esso. ..

+0

Bel lavoro. Ci stiamo avvicinando a una risposta a prova di proiettile, ma flessibile. –

3

il seguente dovrebbe funzionare:

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

dove a e b sono due matrici. Per convertire il risultato in percentuale, moltiplicare per 100.

4

Se wnat per identificare quali elementi sicuro che prova quindi provare questo:

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

Se si vuole dispaly un elenco di indici e valori nei MATRICE1 che soddisfano (o non riescono a soddisfare) tale condizione, allora:

cbind(over_err, MATRIX1[over_err]) 
+1

E se volete ordinare loro, quindi usa solo 'out <- cbind (over_err, values ​​= MATRIX1 [over_err])' e 'out [ordine (valori, decrescente = T),]'. :-) – TMS

+0

Bene: E se volessi solo i "primi cinque", potresti usare: 'out [ordine (valori, decrescente = T),] [1: 5]' –

+1

Buono! :-) Ma se c'è meno di 5, ottieni NA. Forse 'head (out [...], 5)' sarebbe meglio (anche se non così elegante!). – TMS

1

Se la matrice esatta M_exact e la matrice approssimata sono M_app; quindi utilizzando Mathematica, l'errore percentuale può essere calcolata come

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

Per controllare l'errore relativo a elemento di matrice

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

Per ulteriori dettagli: http://www.netlib.org/lapack/lug/node75.html

Problemi correlati