2011-10-12 123 views
5

给定R中的两个浮点矩阵,我想得到每个条目之间的相对误差,然后在所有误差中搜索所有误差的最大值并将其与10%进行比较,即MAX_ERROR <= 10%两个矩阵之间的相对误差

我知道raltive错误的是(对每个条目):

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

如何做到这一点的R,避免for循环?

回答

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 

注意,这不是你的定义略有不同,计算相对误差:它是对称的,并处理小的值 - 这是因为它慢一点。 ...

+0

好的工作。我们正在接近防弹而灵活的答案。 –

3

下面应该工作:

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

其中ab是两个矩阵。将结果转换为百分比,乘以100

4

如果wnat确定哪些元素不能在该试验那就试试这个:如果你想dispaly指数和值的矩阵1满足列表(或不能满足),该条件,那么

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

cbind(over_err, MATRIX1[over_err]) 
+1

如果您想订购他们,那么只需使用'out < - cbind(over_err,values = MATRIX1 [over_err])'和'out [order(values,decrease = T)]''。 :-) – TMS

+0

好的一个:如果你只是想要“前五名”,那么你可以使用:'out [order(values,decrease = T),] [1:5]' –

+1

好! :-)但是如果少于5,你会得到NAs。也许'头(5号)'会更好(虽然不那么优雅!)。 – TMS

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] 

检查相对误差对于进一步的细节: http://www.netlib.org/lapack/lug/node75.html

相关问题