Inversa de la matriz en R


90

Me preguntaba cuál es su forma recomendada de calcular la inversa de una matriz.

Las formas que encontré no parecen satisfactorias. Por ejemplo,

> 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  

¡Gracias!


9
Un consejo general: evite dar a los objetos (como matrices) un nombre que ya se usa (aquí c).
Qaswed

Respuestas:


153

solve(c)da la inversa correcta. El problema con su código es que está utilizando el operador incorrecto para la multiplicación de matrices. Deberías usarsolve(c) %*% c para invocar la multiplicación de matrices en R.

R realiza la multiplicación elemento por elemento cuando invoca solve(c) * c.


22

Puede usar la función ginv () (inversa generalizada de Moore-Penrose) en el paquete MASS


@xeon no está seguro de cómo se lo puede perder; consulte la pág. 60 del Manual para el paquete mencionado en mi respuesta anterior
doug

Gracias por su respuesta. Recibí este error al ejecutar la función fem () del paquete FisherEM. Ejecutando Mavericks Mac OS X.
Vladislavs Dovgalecs

9

Tenga en cuenta que si le importa la velocidad y no necesita preocuparse por las singularidades, solve()debería preferirlo ginv()porque es mucho más rápido, como puede comprobar:

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 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.