行列の逆行列を計算するための推奨される方法は何ですか?
私が見つけた方法は満足のいくものではないようです。例えば、
> c=rbind(c(1, -1/4), c(-1/4, 1))
> c
[,1] [,2]
[1,] 1.00 -0.25
[2,] -0.25 1.00
> inv(c)
Error: could not find function "inv"
> solve(c)
[,1] [,2]
[1,] 1.0666667 0.2666667
[2,] 0.2666667 1.0666667
> solve(c)*c
[,1] [,2]
[1,] 1.06666667 -0.06666667
[2,] -0.06666667 1.06666667
> qr.solve(c)*c
[,1] [,2]
[1,] 1.06666667 -0.06666667
[2,] -0.06666667 1.06666667
ありがとう!
solve(c)
は正しい逆関数を提供します。コードの問題は、行列の乗算に間違った演算子を使用していることです。 Rで行列乗算を呼び出すには、solve(c) %*% c
を使用する必要があります。
solve(c) * c
を呼び出すと、Rは要素ごとの乗算を実行します。
ginv()(Moore-Penrose一般化逆関数)をMASSパッケージ
速度を気にせず、特異点を心配する必要がない場合は、solve()
がginv()
より優先されるべきであることに注意してください。
require(MASS)
mat <- matrix(rnorm(1e6),nrow=1e3,ncol=1e3)
t0 <- proc.time()
inv0 <- ginv(mat)
proc.time() - t0
t1 <- proc.time()
inv1 <- solve(mat)
proc.time() - t1
マトリックス表記では、演算子「*
」と演算子「%*%
」に大きな違いがあります。最初は要素ごとに乗算を行い、2番目は行列乗算の正しい式です。あなたがすべきだったことは:
c = rbind(c(1, -1/4), c(-1/4, 1))
solve(c) %*% c