2010-11-20 255 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 2016-12-10 10:52:04

回答

118

solve(c)確實給出了正確的逆。你的代碼的問題是你正在使用錯誤的運算符來進行矩陣乘法。您應該使用solve(c) %*% c來調用R中的矩陣乘法。

當您調用solve(c) * c時,R執行逐元素乘法。

19

您可以在MASS包中使用該功能ginv()(摩爾 - 彭羅斯廣義逆)

+0

@xeon不知道你怎麼可能會錯過它 - 見p。在我上面的答案中提到的包裝手冊中的60部分 – doug 2014-06-06 07:23:57

+0

謝謝你的回答。從FisherEM軟件包運行函數fem()時出現此錯誤。運行小牛Mac OS X. – 2014-06-06 15:45:37

4

請注意,如果您關心速度,無需擔心奇點,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

在矩陣符號它使一個很大的不同操作者「*「和運營商」%*%「。第一個是乘以元素,第二個是矩陣乘法的正確公式。 什麼後應該做的是:

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

solve(c) %*% c 
+5

你的答案與接受的答案有何不同? – 2016-02-29 18:21:14