R matrisin tersi


90

Bir matrisin tersini hesaplamak için önerilen yolunuzun ne olduğunu merak ediyordum.

Bulduğum yollar tatmin edici görünmüyor. Örneğin,

> 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  

Teşekkürler!


9
Genel bir tavsiye: nesnelere (matrisler gibi) zaten kullanılan (burada c) bir ad vermekten kaçının .
2016

Yanıtlar:


155

solve(c)doğru tersi verir. Kodunuzla ilgili sorun, matris çarpımı için yanlış operatörü kullanıyor olmanızdır. solve(c) %*% cR'de matris çarpımını çağırmak için kullanmalısınız .

R, çağırdığınızda eleman çarpma yapar solve(c) * c.


22

MASS paketinde ginv () (Moore-Penrose genelleştirilmiş ters) işlevini kullanabilirsiniz.


@xeon bunu nasıl özleyebileceğinizden emin değil - bkz. s. Yukarıdaki
cevabımda

Cevabınız için teşekkür ederim. FisherEM paketinden fem () işlevini çalıştırırken bu hatayı aldım. Mavericks Mac OS X'i Çalıştırma
Vladislavs Dovgalecs

9

Hızı önemsiyorsanız ve tekillikler konusunda endişelenmenize gerek yoksa, kontrol edebileceğiniz gibi çok daha hızlı olduğu solve()için tercih edilmesi gerektiğini ginv()unutmayın:

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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.