2010-11-20 50 views
74

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

Cách tôi thấy dường như không thỏa đáng. 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!

+1

Tư vấn chung: tránh cho các vật (như ma trận) tên đã được sử dụng (ở đây 'c'). – Qaswed

Trả lời

118

solve(c) cung cấp sai chính xác. Vấn đề với mã của bạn là bạn đang sử dụng toán tử sai 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ần tử theo phép nhân tố khi bạn gọi solve(c) * c.

19

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

+0

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

+0

Cảm ơn 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. –

4

Lưu ý rằng nếu bạn quan tâm đến tốc độ và không cần phải lo lắng về kỳ dị, solve() nên được ưa thích để ginv() vì nó là nhanh hơn nhiều, như 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 
0

Trong ký hiệu ma trận nó làm cho một sự khác biệt lớn các nhà điều hành "* "và toán tử" %*% ". Phần tử nhân tố đầu tiên theo phần tử, phần tử thứ hai là công thức chính xác cho phép nhân ma trận. Điều bạn nên làm là:

c = rbind(c(1, -1/4), c(-1/4, 1)) 

solve(c) %*% c 
+5

câu trả lời của bạn khác với câu trả lời được chấp nhận như thế nào ??? –

Các vấn đề liên quan