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!


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.


22

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


@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 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.