2011-10-12 119 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

相關問題