Inverse de matrice dans R


90

Je me demandais quelle est votre méthode recommandée pour calculer l'inverse d'une matrice?

Les moyens que j'ai trouvés ne me semblent pas satisfaisants. Par exemple,

> 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  

Merci!


9
Un conseil général: évitez de donner aux objets (comme les matrices) un nom déjà utilisé (ici c).
Qaswed

Réponses:


153

solve(c)donne l'inverse correct. Le problème avec votre code est que vous utilisez le mauvais opérateur pour la multiplication matricielle. Vous devez utiliser solve(c) %*% cpour invoquer la multiplication matricielle dans R.

R effectue une multiplication élément par élément lorsque vous appelez solve(c) * c.


22

Vous pouvez utiliser la fonction ginv () (inverse généralisé de Moore-Penrose) dans le package MASS


@xeon ne sais pas comment vous pourriez le manquer - voir p. 60 du Manuel du Paquet mentionné dans ma réponse ci
doug

Merci pour votre réponse. J'ai eu cette erreur lors de l'exécution de la fonction fem () à partir du package FisherEM. Exécution de Mavericks Mac OS X.
Vladislavs Dovgalecs

9

Notez que si vous vous souciez de la vitesse et que vous n'avez pas à vous soucier des singularités, solve()il faut préférer ginv()car c'est beaucoup plus rapide, comme vous pouvez le vérifier:

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 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.