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.