2012-08-16 35 views
7

Có cách nào tôi có thể chọn một loạt các phần tử đã được xác định trước cùng một lúc từ ma trận không? Cụ thể, giả sử tôi có ma trận sau:R chọn các phần tử cụ thể từ một ma trận cùng một lúc

 58  59  60  62  63  64 
58 0.000000 3.772139 6.367721 8.978718 12.197210 13.401126 
59 3.772139 0.000000 3.755554 5.935946 9.592700 11.664533 
60 6.367721 3.755554 0.000000 5.999409 9.324764 11.991269 
62 8.978718 5.935946 5.999409 0.000000 3.810169 6.762802 
63 12.197210 9.592700 9.324764 3.810169 0.000000 3.796884 
64 13.401126 11.664533 11.991269 6.762802 3.796884 0.000000 

Tôi muốn chọn ô [1,2], [2,3], [3,4], [4,5], [5,6] . Tôi nhận thấy rằng tôi có thể tham chiếu chúng theo chỉ mục, trong trường hợp này tôi có thể chạy:

mymatrix [c (2,9,16,23,30)].

Tuy nhiên, điều này không rõ ràng khi đọc mã sau. Có cách nào tôi có thể nhập tham chiếu (hàng, cột) thực tế cùng một lúc không?

Cảm ơn!

+0

Một cái gì đó như 'as.vector (mymatrix [c (1, 2, 3, 4, 5), c (2, 3, 5, 6)])' (mymatrix [hàng, cột]) – dickoa

Trả lời

12

Indexing có thể được thực hiện với 2 ma trận cột. Sau khi chuyển đổi những hàng và cột số cho một đối tượng R hợp lệ (chứ không phải là biểu hiện Matlab-style):

> idxs <- gsub("\\]",")", gsub("\\[", "c(", "[1,2], [2,3], [3,4], [4,5] ,[5,6]")) 
# I edited the string value that idxs returned: 
> midx <- rbind(c(1,2), c(2,3), c(3,4), c(4,5) ,c(5,6)) 
> mat <- matrix(scan(), nrow=6) 
1: 0.000000 3.772139 6.367721 8.978718 12.197210 13.401126 
7: 3.772139 0.000000 3.755554 5.935946 9.592700 11.664533 
13: 6.367721 3.755554 0.000000 5.999409 9.324764 11.991269 
19: 8.978718 5.935946 5.999409 0.000000 3.810169 6.762802 
25: 12.197210 9.592700 9.324764 3.810169 0.000000 3.796884 
31: 13.401126 11.664533 11.991269 6.762802 3.796884 0.000000 
37: 
Read 36 items 
> mat[midx] 
[1] 3.772139 3.755554 5.999409 3.810169 3.796884 

Nếu mục tiêu của bạn là để chỉ số siêu chéo mà có thể được thực hiện tổng quát hơn:

> mat[col(mat)==row(mat)+1] 
[1] 3.772139 3.755554 5.999409 3.810169 3.796884 
+0

Tôi đã nghĩ rằng ông muốn các giải pháp cho một bộ tùy ý của cặp x-y. Đầu cơ: Cách tiếp cận diag() của bạn với ma trận giảm có lẽ nhanh hơn cách tiếp cận hàng == col + 1 của tôi. –

+0

Tôi quan tâm đến trường hợp chung cho việc chỉnh sửa của riêng tôi. Tuy nhiên, đối với vấn đề tôi đang xem xét, phương pháp diag hoạt động rất tốt. Cảm ơn cả hai người! – user1357015

8

Một giải pháp cho tình hình cụ thể của bạn sẽ được để chọn sub-ma trận và sử dụng các chức năng diag:

R> diag(x[-ncol(x),-1]) 
[1] 3.772139 3.755554 5.999409 3.810169 3.796884 
+0

** I ** thấy rằng "dễ đọc" hơn các chỉ mục, nhưng tôi chắc chắn rằng tôi thuộc thiểu số. – joran

+1

Vâng, @ joran, tôi đã không nhận được nó lúc đầu nhưng bây giờ sau khi được khuyến khích để xem xét lại, tôi thấy những gì đang xảy ra. Có lẽ khá hiệu quả –

3

Một giải pháp tương tự như được đăng ở trên, nhưng giải quyết tình huống có vectơ cho các hàng và vectơ cho các cột (đó là câu hỏi của tôi khi tôi đến chủ đề này) như sau:

> rows <- c(1,2,3,4,5) 
> cols <- c(2,3,4,5,6) 
> call <- cbind(rows,cols) 
> 
> mat[call] 
[1] 3.772139 3.755554 5.999409 3.810169 3.796884 
Các vấn đề liên quan