2010-11-20 18 views
74

Zastanawiam się, jaki jest zalecany sposób obliczania odwrotności macierzy?Odwrotność macierzy w R

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!

+1

Ogólna rada: unikać podawania przedmiotów (takich jak matryce) nazwę, która jest już używana (tu 'C'). – Qaswed

Odpowiedz

118

podaje 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) %*% c, aby wywołać mnożenie macierzy w R.

R wykonuje mnożenie elementu po elemencie, gdy wywołujesz solve(c) * c.

19

Można użyć funkcji ginv() (Moore-Penrose'a uogólnione odwrotny) w MASS pakietu

+0

@xon nie wiem, jak możesz tego przegapić - patrz str. 60 Podręcznika pakietu, o którym mowa w mojej odpowiedzi powyżej – doug

+0

Dziękuję za odpowiedź. Mam ten błąd podczas uruchamiania funkcji fem() z pakietu FisherEM. Uruchamianie Mavericks Mac OS X. –

4

pamiętać, że jeśli zależy Ci na szybkości i nie trzeba się martwić o osobliwości, solve() powinny być korzystne ginv() ponieważ jest o wiele szybsze, jak można 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 
0

w notacji macierzowej to robi dużą różnicę operatora "* "i operatora" %*% ". Pierwszy element mnożony jest po elemencie, drugi to poprawna formuła mnożenia macierzy. Co należy zrobić, to Hou są:

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

solve(c) %*% c 
+5

jak twoja odpowiedź różni się od zaakceptowanej odpowiedzi ??? –