R中矩阵的逆

Tim*_*Tim 83 r matrix-inverse

我想知道你推荐的计算矩阵逆的方法是什么?

我发现的方式似乎并不令人满意.例如,

> 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  
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 141

solve(c)确实给出了正确的逆.您的代码的问题是您使用错误的运算符进行矩阵乘法.您应该使用solve(c) %*% c在R中调用矩阵乘法.

R在调用时逐个元素执行solve(c) * c.


dou*_*oug 21

您可以在MASS包中使用函数ginv()(Moore-Penrose广义逆)


Mat*_*her 8

请注意,如果您关心速度并且不需要担心奇点,那么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 
Run Code Online (Sandbox Code Playgroud)

  • +1:我只是使用solve来反转近奇异矩阵(条件数10^15),它产生了与ginv不同的答案。检查 XX^-1 发现解决效果很好,而 ginv 产生了垃圾 (2认同)