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. ..
Bel lavoro. Ci stiamo avvicinando a una risposta a prova di proiettile, ma flessibile. –