【发布时间】:2011-10-12 16:04:26
【问题描述】:
给定 R 中的两个浮点矩阵,我想得到每个条目之间的相对误差,然后在所有误差中搜索所有误差的最大值并将其与 10% 进行比较,即MAX_ERROR <= 10%
我知道相对错误是(对于每个条目):
|v_ij(MATRIX1) - v_ij(MATRIX2)| / | v_ij(MATRIX1)|
如何在R 中做到这一点,避免 for 循环?
【问题讨论】:
给定 R 中的两个浮点矩阵,我想得到每个条目之间的相对误差,然后在所有误差中搜索所有误差的最大值并将其与 10% 进行比较,即MAX_ERROR <= 10%
我知道相对错误是(对于每个条目):
|v_ij(MATRIX1) - v_ij(MATRIX2)| / | v_ij(MATRIX1)|
如何在R 中做到这一点,避免 for 循环?
【问题讨论】:
如果您想处理矩阵中为零的情况(否则会导致除以零),此答案有一些解决方案: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
请注意,这计算的相对误差与您的定义略有不同:它是对称的并且处理较小的值 - 因此速度会慢一些...
【讨论】:
如果您想确定哪些元素未通过该测试,请尝试以下操作:
over_err <- which( abs(MATRIX1-MATRIX2)/abs(MATRIX1) > 0.1, arr.ind=TRUE)
如果您想在 MATRIX1 中显示满足(或不满足)该条件的索引和值列表,则:
cbind(over_err, MATRIX1[over_err])
【讨论】:
out <- cbind(over_err, values = MATRIX1[over_err]) 和out[order(values, decreasing = T),]。 :-)
out[order(values, decreasing = T),][1:5]
head(out[...], 5) 会更好(虽然不是那么优雅!)。
out[order(values, decreasing = T),][ 1:max(NROW(out), 5) ]
以下应该有效:
maxerr <- max(abs((a - b) / a))
其中a 和b 是两个矩阵。要将结果转换为百分比,请乘以 100。
【讨论】:
如果精确矩阵是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]
【讨论】: