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年

Answers:


152

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

当您调用时,R执行逐个元素的乘法solve(c) * c


22

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


@xeon不确定您怎么会错过它-请参阅第40页。我在上面的回答中提到的“包装手册”中的60
格(Doug)

谢谢您的回答。从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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.