web-dev-qa-db-ja.com

Rの行列の逆

行列の逆行列を計算するための推奨される方法は何ですか?

私が見つけた方法は満足のいくものではないようです。例えば、

> 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  

ありがとう!

81
Tim

solve(c)は正しい逆関数を提供します。コードの問題は、行列の乗算に間違った演算子を使用していることです。 Rで行列乗算を呼び出すには、solve(c) %*% cを使用する必要があります。

solve(c) * cを呼び出すと、Rは要素ごとの乗算を実行します。

136
user28

ginv()(Moore-Penrose一般化逆関数)をMASSパッケージ

21
doug

速度を気にせず、特異点を心配する必要がない場合は、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
1
Cerbero