2012-10-01 36 views
6

Tôi muốn lấy một cột khác nhau trong mỗi hàng từ một ma trận. Ví dụ:Nhận cột khác nhau trong mỗi hàng

A = [1,2;1,4;5,2] 
B = [2;2;1] 

đầu ra nên năng suất:

out = [2;4;5] 

Vì vậy, trong ngắn hạn: A là ma trận và B có các chỉ số cho colums mỗi hàng. Làm thế nào tôi có thể làm điều này mà không cần sử dụng một vòng lặp (nếu nó có thể)?

Trả lời

7

Bạn có thể sử dụng sub2ind để chuyển đổi các chỉ số (i, j) để chỉ số tuyến tính trong ma trận A

idx = sub2ind(size(A), 1:size(A, 1), B'); 
A(idx) 

ans = 

2  4  5 

mà làm việc giả định rằng vector B có nhiều entry như có một dòng ở A. Trong sub2ind trên tạo chỉ mục tuyến tính cho mỗi cặp số hàng tiếp theo (1: kích thước (A, 1)) và số cột được cung cấp trong B.

+0

Điều này hoạt động hoàn hảo, cảm ơn bạn. Tôi phải tìm tài liệu của sub2ind để hiểu hoàn toàn cách thức hoạt động của nó. – Tim

7

Bạn có thể thực hiện theo số diag(A(:,B)), tuy nhiên, chỉ có một vòng lặp. Tôi không biết làm thế nào để làm điều đó mà không có bất kỳ vòng lặp.

+1

Cũng giống như câu trả lời bằng cách sử dụng sub2ind, điều này cũng làm các trick hoàn hảo. – Tim

+1

Phương pháp này hoạt động tất nhiên, nhưng trên đường nó tạo ra một ma trận N x N (A (:, B)). Đây là một chi phí khá lớn, khi những gì bạn thực sự muốn cuối cùng là một vectơ có kích thước N. – angainor

+1

Đúng, và đó là lý do tại sao tôi chọn câu trả lời của bạn là câu trả lời thực tế :-). – Tim

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