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.