Tôi cần tính giá trị trung bình của từng phần tử đường chéo trong ma trận n × n. Hình tam giác phía dưới và phía trên là thừa. Đây là mã tôi hiện đang sử dụng:Cách tính trung bình đường chéo nhanh hơn trong ma trận lớn
A <- replicate(500, rnorm(500))
sapply(1:(nrow(A)-1), function(x) mean(A[row(A) == (col(A) - x)]))
Có vẻ như nó hoạt động nhưng không có quy mô tốt với ma trận lớn hơn. Những cái tôi không có lớn, khoảng 2-5000^2, nhưng thậm chí với 1000^2 nó mất nhiều thời gian hơn tôi muốn:
A <- replicate(1000, rnorm(1000))
system.time(sapply(1:(nrow(A)-1), function(x) mean(A[row(A) == (col(A) - x)])))
> user system elapsed
> 26.662 4.846 31.494
Có cách nào thông minh hơn không?
chỉnh sửa Để làm rõ, tôi muốn ý nghĩa của từng đường chéo một cách độc lập, ví dụ: cho:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
Tôi muốn:
mean(c(1,2,3))
mean(c(1,2))
mean(1)
Sử dụng tốt các chỉ số. Tôi bỏ phiếu cho câu trả lời này là câu trả lời được chấp nhận, vì nó minh họa các chỉ số mạnh mẽ như thế nào. –
Cảm ơn bạn, nhưng bạn rõ ràng hơn nhiều, @ JorisMeys; cách tiếp cận này sẽ có giá trị thêm biến chứng chỉ khi đó là một cái gì đó bạn phải làm một _lot_ và mỗi thứ mười của một quảng cáo thứ hai lên. –
Rất thông minh - tôi phải làm việc thông qua việc tạo các chỉ mục để hiểu những gì đang diễn ra. Cảm ơn câu trả lời – blmoore