Pembalikan matriks di R

90

Saya bertanya-tanya apa cara yang Anda rekomendasikan untuk menghitung invers dari sebuah matriks?

Cara yang saya temukan sepertinya tidak memuaskan. Sebagai contoh,

> 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  

Terima kasih!

Tim
sumber
9
Saran umum: hindari memberi objek (seperti matriks) nama yang sudah digunakan (di sini c).
Qaswed

Jawaban:

153

solve(c)memberikan kebalikan yang benar. Masalah dengan kode Anda adalah Anda menggunakan operator yang salah untuk perkalian matriks. Anda harus menggunakan solve(c) %*% cperkalian matriks di R.

R melakukan perkalian elemen demi elemen saat Anda memanggil solve(c) * c.


sumber
22

Anda dapat menggunakan fungsi ginv () (Moore-Penrose generalized inverse) dalam paket MASS

doug
sumber
@xeon tidak yakin bagaimana Anda bisa melewatkannya - lihat hal. 60 dari Manual untuk Paket yang dirujuk dalam jawaban saya di atas
doug
Terima kasih atas jawaban Anda. Saya mendapat kesalahan ini saat menjalankan fungsi fem () dari paket FisherEM. Menjalankan Mavericks Mac OS X.
Vladislavs Dovgalecs
9

Perhatikan bahwa jika Anda peduli dengan kecepatan dan tidak perlu khawatir tentang singularitas, solve()sebaiknya diutamakan ginv()karena jauh lebih cepat, karena Anda dapat memeriksa:

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
sumber