2010-11-20 23 views
74

Ich frage mich, was ist Ihre empfohlene Methode, um das Inverse einer Matrix zu berechnen?Inverse Matrix in R

Die Möglichkeiten, die ich gefunden habe, scheinen nicht befriedigend. Zum Beispiel

> 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 

Vielen Dank!

+1

Eine allgemeine Beratung: Vermeiden Sie Objekte geben (wie Matrizen) einen Namen, der bereits verwendet wird (hier 'c'). – Qaswed

Antwort

118

solve(c) gibt die richtige inverse. Das Problem mit Ihrem Code ist, dass Sie den falschen Operator für die Matrixmultiplikation verwenden. Sie sollten solve(c) %*% c verwenden, um die Matrixmultiplikation in R aufzurufen.

R führt elementweise Multiplikation durch, wenn Sie solve(c) * c aufrufen.

19

können Sie verwenden, um die Funktion ginv() (Moore-Penrose verallgemeinerte inverse) in der MASS Paket

+0

@xeon nicht sicher, wie Sie es verpassen könnten - siehe p. 60 des Handbuchs für das Paket in meiner Antwort erwähnt – doug

+0

Vielen Dank für Ihre Antwort. Ich habe diesen Fehler beim Ausführen der Funktion fem() aus dem FisherEM-Paket erhalten. Laufende Mavericks Mac OS X. –

4

Beachten Sie, wenn Sie auf Geschwindigkeit und müssen sich nicht um Singularitäten sorgen, solve() werden sollten, um ginv() bevorzugt, weil es viel schneller ist, wie Sie überprüfen können:

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

In Matrizenschreibweise es einen großen Unterschied den Operator "macht"und der Operator" %*% ". Die erste macht die Multiplikation Element für Element, die zweite ist die korrekte Formel für die Matrixmultiplikation. Was hou haben sollte getan ist:

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

solve(c) %*% c 
+5

Wie unterscheidet sich Ihre Antwort von der angenommenen Antwort ??? –