Nghịch đảo của ma trận trong R


90

Tôi đã tự hỏi cách đề xuất của bạn để tính nghịch đảo của ma trận là gì?

Những cách tôi thấy có vẻ không khả quan. Ví dụ,

> 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  

Cảm ơn!


9
Một lời khuyên chung: tránh đặt tên cho các đối tượng (như ma trận) đã được sử dụng (tại đây c).
Qaswed

Câu trả lời:


153

solve(c)không đưa ra nghịch đảo chính xác. Vấn đề với mã của bạn là bạn đang sử dụng sai toán tử cho phép nhân ma trận. Bạn nên sử dụng solve(c) %*% cđể gọi phép nhân ma trận trong R.

R thực hiện phép nhân phần tử khi bạn gọi solve(c) * c.


22

Bạn có thể sử dụng hàm ginv () (nghịch đảo tổng quát Moore-Penrose) trong gói MASS


@xeon không chắc làm thế nào bạn có thể bỏ lỡ nó - xem p. 60 của Hướng dẫn sử dụng cho Gói được đề cập trong câu trả lời của tôi ở trên
doug 06/06

Cảm ơn về câu trả lời của bạn. Tôi gặp lỗi này khi chạy hàm fem () từ gói FisherEM. Chạy Mavericks Mac OS X.
Vladislavs Dovgalecs

9

Lưu ý rằng nếu bạn quan tâm đến tốc độ và không cần lo lắng về các điểm kỳ dị, solve()thì nên ưu tiên hơn ginv()vì nó nhanh hơn nhiều, vì bạn có thể kiểm tra:

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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.