Inverso da matriz em R

90

Eu queria saber qual é a sua maneira recomendada de calcular o inverso de uma matriz?

As maneiras que encontrei não parecem satisfatórias. Por exemplo,

> 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  

Obrigado!

Tim
fonte
9
Um conselho geral: evite dar a objetos (como matrizes) um nome que já é usado (aqui c).
Qaswed de

Respostas:

155

solve(c)dá o inverso correto. O problema com o seu código é que você está usando o operador errado para a multiplicação da matriz. Você deve usar solve(c) %*% cpara invocar a multiplicação da matriz em R.

R executa a multiplicação elemento por elemento quando você invoca solve(c) * c.


fonte
22

Você pode usar a função ginv () (Moore-Penrose generalized inverse) no pacote MASS

doug
fonte
@xeon não tem certeza de como você pode perdê-la - veja p. 60 do Manual para o Pacote referido na minha resposta acima
doug
Obrigado pela sua resposta. Recebi este erro ao executar a função fem () do pacote FisherEM. Executando Mavericks Mac OS X.
Vladislavs Dovgalecs
9

Observe que se você se preocupa com a velocidade e não precisa se preocupar com as singularidades, solve()deve ser preferível ginv()porque é muito mais rápido, como você pode verificar:

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 
Matthias Schmidtblaicher
fonte