Odwrotność macierzy w R

90

Zastanawiałem się, jaki jest twój zalecany sposób obliczenia odwrotności macierzy?

Sposoby, które znalazłem, wydają się niezadowalające. Na przykład,

> 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  

Dzięki!

Tim
źródło
9
Ogólna rada: unikaj nadawania obiektom (takim jak macierze) nazwy, która jest już używana (tutaj c).
Qaswed

Odpowiedzi:

153

solve(c)daje poprawną odwrotność. Problem z twoim kodem polega na tym, że używasz niewłaściwego operatora do mnożenia macierzy. Powinieneś użyć solve(c) %*% cdo wywołania mnożenia macierzy w R.

R wykonuje mnożenie element po elemencie podczas wywoływania solve(c) * c.


źródło
22

Możesz użyć funkcji ginv () (uogólniona odwrotność Moore-Penrose'a) w pakiecie MASS

Doug
źródło
@xeon nie wiem, jak możesz to przegapić - patrz str. 60 Podręcznika pakietu, o którym mowa w mojej odpowiedzi powyżej
doug
Dziękuję za Twoją odpowiedź. Ten błąd wystąpił podczas uruchamiania funkcji fem () z pakietu FisherEM. Uruchamianie Mavericks Mac OS X.
Vladislavs Dovgalecs
9

Zauważ, że jeśli zależy Ci na szybkości i nie musisz martwić się o osobliwości, solve()powinien być preferowany, ginv()ponieważ jest znacznie szybszy, co możesz sprawdzić:

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
źródło