2010-11-20 18 views
74

行列の逆行列を計算するにはどうすればよいでしょうか?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 

ありがとうございます!

+1

一般的なアドバイスは:(行列のような)がすでに使用されている名前(ここでは 'C')のオブジェクトを与えません。 – Qaswed

答えて

118

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

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

19

あなたはMASSパッケージに

+0

@xeonあなたがそれを見逃す可能性があるかどうかはわかりません。上記の私の答えに記載されているパッケージのマニュアルの60の – doug

+0

あなたの答えをありがとう。 FisherEMパッケージから関数fem()を実行しているときにこのエラーが発生しました。実行中のマーベリックスMac OS X. –

4

注意を機能ginv()(ムーア・ペンローズ一般逆)を使用することができますが、スピードを気にして特異点を心配する必要がない場合は、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 
0

それはオペレータ "大きな違いになり* "、演算子" %*% "となります。最初は要素ごとに乗算を行い、2つ目は行列乗算の正しい式です。 何HOUがやるべきことは次のとおりです。

c = rbind(c(1, -1/4), c(-1/4, 1)) 

solve(c) %*% c 
+5

あなたの答えは受け入れられた回答とどのように違うのですか? –