Rの逆行列


90

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

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

> 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  

ありがとう!


9
一般的なアドバイス:オブジェクト(行列など)にすでに使用されている名前(ここc)を付けないでください。
Qaswed 2016

回答:


153

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

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


22

MASSパッケージで関数ginv()(ムーア-ペンローズ一般逆行列)を使用できます。


@xeonは、どうすればそれを見逃すことができるかわかりません。パッケージのためのマニュアルの60は、上記の私の答えに言及
ダグ

ご回答ありがとうございます。FisherEMパッケージから関数fem()を実行すると、このエラーが発生しました。マーベリックスはMac OS Xを実行している
Vladislavs Dovgalecs

9

速度を気にし、特異点を気にする必要がない場合は、以下を確認できるように、はるかに高速であるため、より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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.