2011-10-12 21 views
5

Rの2つの浮動行列を考えてみましょう。すべての誤差の中で、すべての誤差の中ですべての誤差の中で相対誤差を求めて10%と比較します。つまり、MAX_ERROR <= 10%2つの行列の間の相対誤差

私はraltiveエラーが(各エントリのため)であることを知っている:

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

forループを避け、Rでこれを行うには?

答えて

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

次のように動作するはずです:

abは2つの行列である
maxerr <- max(abs((a - b)/a)) 

。結果をパーセンテージに変換するには、100を掛けます。

4

あなたがテストは、この試みることに失敗した要素を識別するためにwnat場合:あなたは、その条件を満たす行列1におけるインデックスと値のリストをdispaly(または満たすために失敗)したい場合は

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 = T) 'を使用するだけです。 :-) – TMS

+0

いいえ:「トップ5」がほしいと思うなら、あなたはそれを使うことができます: 'out [order(values、decrease = T)、] [1:5]' –

+1

Good! :-)しかし、5以下の場合、あなたはNAを取得します。たぶん 'head(out [...]、5)'はより良いでしょう(それほどエレガントではありません!)。 – TMS

1

厳密行列M_exactと近似行列がM_appの場合、その後、Mathematicaを使用して、パーセント誤差は、行列要素の相対誤差をさらに詳細については

Relative_error = (Abs[M_app - M_exact])/Abs[M_exact] 

確認するには

error(%) = 100(Norm[M_app - M_exact]/Norm[M_exact]) 

のように計算することができます。 http://www.netlib.org/lapack/lug/node75.html