Inverse der Matrix in R.

88

Ich habe mich gefragt, wie Sie die Umkehrung einer Matrix empfehlen können.

Die Wege, die ich gefunden habe, scheinen nicht zufriedenstellend zu sein. Beispielsweise,

> 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!

Tim
quelle
7
Ein allgemeiner Rat: Vermeiden Sie es, Objekten (wie Matrizen) einen Namen zu geben, der bereits verwendet wird (hier c).
Qaswed

Antworten:

150

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

R führt beim Aufrufen eine Element-für-Element-Multiplikation durch solve(c) * c.


quelle
22

Sie können die Funktion ginv () (Moore-Penrose generalized inverse) im MASS- Paket verwenden

Doug
quelle
@xeon nicht sicher, wie Sie es verpassen könnten - siehe S. 60 des Handbuchs für das Paket, auf das in meiner obigen Antwort
Bezug genommen wurde
Vielen Dank für Ihre Antwort. Ich habe diesen Fehler beim Ausführen der Funktion fem () aus dem FisherEM-Paket erhalten. Ausführen von Mavericks Mac OS X.
Vladislavs Dovgalecs
9

Beachten Sie, dass Sie, wenn Sie Wert auf Geschwindigkeit legen und sich nicht um Singularitäten kümmern müssen, solve()dies vorziehen sollten, ginv()da 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 
Matthias Schmidtblaicher
quelle