给定R中的两个浮点矩阵,我希望得到每个条目之间的相对误差,然后在所有错误中搜索所有错误的最大值并将其与10%进行比较,即 MAX_ERROR <= 10%
我知道raltive错误是(对于每个条目):
|v_ij(MATRIX1) - v_ij(MATRIX2)| / | v_ij(MATRIX1)|
Run Code Online (Sandbox Code Playgroud)
如何做到这一点R,避免for循环?
如果您要确定哪些元素未通过该测试,请尝试以下操作:
over_err <- which( abs(MATRIX1-MATRIX2)/abs(MATRIX1) > 0.1, arr.ind=TRUE)
Run Code Online (Sandbox Code Playgroud)
如果要在MATRIX1中显示满足(或不满足)该条件的索引和值的列表,则:
cbind(over_err, MATRIX1[over_err])
Run Code Online (Sandbox Code Playgroud)
如果要处理矩阵中包含零的情况(否则将导致被零除),此答案有一些解决方案:您是否将==和!=重新分配给isTRUE(all.equal())?
almostEqual我建议在那里稍微修改一下功能将产生:
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
Run Code Online (Sandbox Code Playgroud)
请注意,此方法计算的相对误差与您的定义略有不同:它是对称的并且处理较小的值-由于它,它的速度稍慢...