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.