Inversa della matrice in R


90

Mi chiedevo qual è il tuo modo consigliato per calcolare l'inverso di una matrice?

I modi che ho trovato non sembrano soddisfacenti. Per esempio,

> 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  

Grazie!


9
Un consiglio generale: evitare di dare agli oggetti (come le matrici) un nome che è già usato (qui c).
Qaswed

Risposte:


153

solve(c)fornisce l'inverso corretto. Il problema con il tuo codice è che stai usando l'operatore sbagliato per la moltiplicazione di matrici. Dovresti usare solve(c) %*% cper invocare la moltiplicazione di matrici in R.

R esegue la moltiplicazione elemento per elemento quando si richiama solve(c) * c.


22

È possibile utilizzare la funzione ginv () (inversa generalizzata di Moore-Penrose) nel pacchetto MASS


@xeon non è sicuro di come potresti perderlo - vedi p. 60 del Manuale per il pacchetto a cui si fa riferimento nella mia risposta sopra
doug

La ringrazio per la risposta. Ho ricevuto questo errore durante l'esecuzione della funzione fem () dal pacchetto FisherEM. Esecuzione di Mavericks Mac OS X.
Vladislavs Dovgalecs

9

Nota che se ti interessa la velocità e non devi preoccuparti delle singolarità, solve()dovrebbe essere preferito a ginv()perché è molto più veloce, come puoi controllare:

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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.