2009-07-18 35 views
6

Xem xét một ma trận M và một tập hợp các kí hiệu được lưu trữ trong các cột tôiJ. Tôi cần truy cập các yếu tố được chỉ định bởi I & J mà không chuyển đổi chúng thành chỉ mục tuyến tính (tức là sử dụng sub2ind). Ví dụ.Truy cập vào các giá trị sử dụng kí hiệu mà không sử dụng sub2ind

M = [1 2 3;4 5 6;7 8 9]; 
I = [1 1 1]; 
J = [1 2 3]; 

VALS = [1 2 3]; 

Ngoài ra, cách làm như sau là không khả thi vì tôi & J là huge:

VALS = diag(M(I,J)); 

Và đối với cuộc biểu tình, đây là không những gì tôi đang tìm kiếm,

VALS = M(sub2ind(size(M),I,J)); 

Về cơ bản sub2ind dường như mất nhiều thời gian và ngay bây giờ tôi đang tìm kiếm các phương pháp để truy cập các yếu tố này t chuyển đổi các chỉ số thành chỉ mục. Bất kỳ cách nào khác là khả thi miễn là nó nhanh hơn phương pháp sử dụng sub2ind.

Trả lời

7

này thể thể nhanh hơn so với sử dụng SUB2IND:

[r,c] = size(M); % Get the size of M 
vals = M(I+r.*(J-1)); % Compute a linear index with vector operations 
+1

Trong các phiên bản gần đây của Matlab, điều này thực sự có thể tránh được cấp phát bộ nhớ lớn, bởi vì Matlab thường là đủ thông minh để tính toán kết quả trung gian mà không cần tạo temporaries lớn, tức là nó sẽ làm việc lập chỉ mục và phân công cách một người sẽ làm điều đó trong C. –

+0

Điều đó thực sự giống như những gì 'sub2ind' làm ngoại trừ kiểm tra giới hạn. Lợi ích tốc độ chủ yếu đến từ việc bỏ qua các cuộc gọi đến 'min' và' max' mà các kiểm tra giới hạn đó thực hiện trên các chỉ mục. Trái ngược với những gì ông Fooz đã viết, trong một số bài kiểm tra tôi đã thực hiện trong R2015b với một số 'I' và' J', nó trở nên hiệu quả hơn một chút để tính toán chỉ số tuyến tính đầu tiên như 'ind = I + r . * (J-1) 'và sau đó' M (ind) ', thay vì tính toán' M (I + r. * (J-1)) 'trong một lần. –

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