97

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

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

> 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  

ありがとう!

4

4 に答える 4

167

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

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

于 2010-11-20T01:13:35.630 に答える
24

MASSパッケージで関数ginv() (Moore-Penrose generalized inverse) を使用できます。

于 2010-11-20T01:44:55.550 に答える
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 
于 2016-02-27T16:37:57.437 に答える