给定R中的两个浮点矩阵,我想得到每个条目之间的相对误差,然后在所有错误中搜索所有错误的最大值并将其与10%进行比较,即MAX_ERROR <= 10%
我知道raltive错误是(对于每个条目):
|v_ij(MATRIX1) - v_ij(MATRIX2)| / | v_ij(MATRIX1)|
如何在R
中执行此操作,避免使用for循环?
答案 0 :(得分:4)
如果您想确定哪个元素未通过该测试,请尝试以下方法:
over_err <- which( abs(MATRIX1-MATRIX2)/abs(MATRIX1) > 0.1, arr.ind=TRUE)
如果你想在MATRIX1中显示满足(或不满足)条件的索引和值列表,那么:
cbind(over_err, MATRIX1[over_err])
答案 1 :(得分:4)
如果你想处理矩阵中有零的情况(否则会导致除零),这个答案有一些解决方案:Do you reassign == and != to 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
请注意,这会计算出的相对误差与您的定义略有不同:它是对称的并处理小值 - 由于它而有点慢......
答案 2 :(得分:3)
以下内容应该有效:
maxerr <- max(abs((a - b) / a))
其中a
和b
是两个矩阵。要将结果转换为百分比,请乘以100
。
答案 3 :(得分:1)
如果精确矩阵M_exact和近似矩阵是M_app;然后使用Mathematica,百分比误差可以计算为
error(%) = 100(Norm[M_app - M_exact]/Norm[M_exact])
检查矩阵元素中的相对误差
Relative_error = (Abs[M_app - M_exact])/Abs[M_exact]