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!


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.


22

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


@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 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.