2011-01-30 36 views
9

Tôi có một ma trận, ví dụMATLAB chỉ mục câu hỏi

A = [ 1 2 3; 4 5 6; 7 8 9] ; 

và một vector của các kích thước 1x3 mà chỉ rõ yếu tố nào trong mỗi hàng là một trong tôi đang tìm kiếm - ví dụ: Nếu

vector = [ 1 2 1 ] 

sau đó đầu ra mong muốn là

[ 1 5 7 ] 

từ 1 là yếu tố 1'st ở hàng 1'st, 01.237.là 2'nd trong hàng 2'nd và 7 là phần tử 1'st ở hàng thứ 3.

Làm cách nào để đạt được điều này? Không thể tìm thấy một chức năng được xây dựng để làm điều này, làm tôi ngạc nhiên.

+1

Liên quan: [Truy cập giá trị sử dụng các bảng con mà không sử dụng sub2ind] (http://stackoverflow.com/questions/1146719/accessing-values-using-subscripts-without-using-sub2ind) – gnovice

Trả lời

6

Trước hết, các chỉ mục trong Matlab chuyển từ trên xuống dưới.
Vì vậy, trong trường hợp của bạn A [1] = 1, A [2] = 4, A [3] = 7

Điều đó nói rằng, nó sẽ dễ dàng hơn để làm việc trên A', vì nó nhiều hơn một chút không đáng kể.

B = A'; 

B((vector + [0:2].* 3)) 
+0

Từ tài liệu: * "A (:) là tất cả các phần tử của A, được coi là một cột đơn. "*. Là một lưu ý phụ để hiểu được lập chỉ mục. – zellus

5

Hơi xấu xí, nhưng diag(A(1:3,[1 2 1])) sẽ thực hiện thủ thuật.

+0

Tôi đã làm điều tương tự: diag (A (:, vector)) ' –

8

MATLAB cung cấp các SUB2IND chức năng để chuyển đổi hàng/cột subscript để chỉ số tuyến tính:

>> A = [1 2 3; 4 5 6; 7 8 9]; 
>> idx = sub2ind(size(A),1:3,[1 2 1]); %# rows: [1 2 3], cols: [1 2 1] 
>> A(idx) 
    1  5  7 
0

Dưới đây là một biến thể của Yochai's answer nhưng nếu không có sự chuyển vị (đây cũng là cơ bản những gì SUB2IND nào trong Amro's answer):

output = A((1:3)+3.*(vector-1)); 

Hoặc cho một mảng A có kích thước tùy ý:

nRows = size(A,1); 
output = A((1:nRows)+nRows.*(vector-1));