Rの2つの浮動行列を考えてみましょう。すべての誤差の中で、すべての誤差の中ですべての誤差の中で相対誤差を求めて10%と比較します。つまり、MAX_ERROR <= 10%
2つの行列の間の相対誤差
私はraltiveエラーが(各エントリのため)であることを知っている:
|v_ij(MATRIX1) - v_ij(MATRIX2)|/| v_ij(MATRIX1)|
forループを避け、R
でこれを行うには?
Rの2つの浮動行列を考えてみましょう。すべての誤差の中で、すべての誤差の中ですべての誤差の中で相対誤差を求めて10%と比較します。つまり、MAX_ERROR <= 10%
2つの行列の間の相対誤差
私はraltiveエラーが(各エントリのため)であることを知っている:
|v_ij(MATRIX1) - v_ij(MATRIX2)|/| v_ij(MATRIX1)|
forループを避け、R
でこれを行うには?
あなたは行列が(そうでない場合はゼロ除算につながる)、その中にゼロを持っているケースを処理したい場合は、この答えは、いくつかの解決策があります: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
注意これは少し異なり、あなたの定義よりも相対誤差を計算すること:それは対称だと小さい値を扱う - そしてそれはそれのために少し遅くなりますが。 ..
次のように動作するはずです:
a
と
b
は2つの行列である
maxerr <- max(abs((a - b)/a))
。結果をパーセンテージに変換するには、100
を掛けます。
あなたがテストは、この試みることに失敗した要素を識別するためにwnat場合:あなたは、その条件を満たす行列1におけるインデックスと値のリストをdispaly(または満たすために失敗)したい場合は
over_err <- which(abs(MATRIX1-MATRIX2)/abs(MATRIX1) > 0.1, arr.ind=TRUE)
を:
cbind(over_err, MATRIX1[over_err])
をそして、あなたはそれらを注文したい場合は、 'out < - cbind(over_err、values = MATRIX1 [over_err])'と 'out(order、values = T) 'を使用するだけです。 :-) – TMS
いいえ:「トップ5」がほしいと思うなら、あなたはそれを使うことができます: 'out [order(values、decrease = T)、] [1:5]' –
Good! :-)しかし、5以下の場合、あなたはNAを取得します。たぶん 'head(out [...]、5)'はより良いでしょう(それほどエレガントではありません!)。 – TMS
厳密行列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
良い仕事。私たちは弾丸ではなく柔軟な答えに近づいています。 –