2011-10-12 39 views
5

Với hai ma trận nổi trong R, tôi muốn nhận được lỗi tương đối giữa mỗi mục nhập, và sau đó trong tất cả các lỗi tìm kiếm tối đa của tất cả chúng và so sánh nó với 10%, tức là MAX_ERROR <= 10%Sai số tương đối giữa hai ma trận

tôi biết rằng lỗi raltive là (đối với mỗi mục):

|v_ij(MATRIX1) - v_ij(MATRIX2)|/| v_ij(MATRIX1)| 

làm thế nào để làm điều này trong R, tránh một vòng lặp for?

Trả lời

4

Nếu bạn muốn xử lý trường hợp ma trận có zero trong đó (mà nếu không dẫn đến phép chia cho không), câu trả lời này có một số giải pháp: Do you reassign == and != to isTRUE(all.equal())?

Một sửa đổi chút ít trong những almostEqual chức năng tôi đề nghị có sẽ mang lại:

relativeError <- function(x, y, tolerance=1e-8) { 
    diff <- abs(x - y) 
    mag <- pmax(abs(x), abs(y)) 
    ifelse(mag > tolerance, diff/mag, diff) 
} 

m1 <- cbind(c(0,1), c(1,1)) 
m2 <- cbind(c(0,1), c(1,1.11)) 
any(relativeError(m1, m2) > 0.01) # TRUE 

# Building on @DWin's answer: 
which(relativeError(m1, m2) > 0.01, arr.ind=TRUE) # 2 2 

Lưu ý rằng điều này sẽ tính toán sai số tương đối hơi khác so với định nghĩa của bạn: đó là đối xứng và xử lý các giá trị nhỏ - và đó là một chút chậm hơn vì điều đó. ..

+0

Làm việc tốt. Chúng tôi đang tiếp cận một câu trả lời chống đạn, nhưng linh hoạt. –

3

Sau đây nên làm việc:

maxerr <- max(abs((a - b)/a)) 

nơi ab là hai ma trận. Để chuyển đổi kết quả thành phần trăm, nhân với 100.

4

Nếu bạn wnat để xác định các yếu tố thất bại mà kiểm tra sau đó thử này:

over_err <- which(abs(MATRIX1-MATRIX2)/abs(MATRIX1) > 0.1, arr.ind=TRUE) 

Nếu bạn muốn dispaly một danh sách các chỉ số và giá trị trong MATRIX1 đáp ứng (hoặc không đáp ứng) điều kiện sau đó:

cbind(over_err, MATRIX1[over_err]) 
+1

Và nếu bạn muốn đặt hàng cho họ, sau đó chỉ sử dụng 'out <- cbind (over_err, values ​​= MATRIX1 [over_err])' và 'out [thứ tự (giá trị, giảm = T),]'. :-) – TMS

+0

Tốt nhất: Và nếu bạn chỉ muốn "năm đầu", bạn có thể sử dụng: 'ra [thứ tự (giá trị, giảm = T),] [1: 5]' –

+1

Tốt! :-) Nhưng nếu có ít hơn 5, bạn sẽ nhận được NA. Có lẽ 'đầu (ra [...], 5)' sẽ tốt hơn (mặc dù không phải là thanh lịch!). – TMS

1

Nếu ma trận chính xác M_exact và ma trận xấp xỉ là M_app; sau đó sử dụng Mathematica, sai số tỷ lệ phần trăm có thể được tính như

error(%) = 100(Norm[M_app - M_exact]/Norm[M_exact]) 

Để kiểm tra sai số tương đối trong phần tử ma trận

Relative_error = (Abs[M_app - M_exact])/Abs[M_exact] 

Mọi chi tiết: http://www.netlib.org/lapack/lug/node75.html

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