2011-01-30 432 views
9

我有一個矩陣,例如MATLAB索引問題

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

和大小1×3的向量指定每一行中哪一個元素是我正在尋找一個 - 即如果

vector = [ 1 2 1 ] 

然後期望的輸出是

[ 1 5 7 ] 

因爲1是第1'行中的第1'元件,5是第2行中的第2位,7是第3行中的第1位元素。

我該如何做到這一點?找不到內置函數來做到這一點,這讓我感到驚訝。

+1

相關:[使用下標而不使用sub2ind訪問值](http://stackoverflow.com/questions/1146719/accessing-values-using-subscripts-without-using-sub2ind) – gnovice 2011-01-31 15:46:26

回答

6

首先,Matlab中的索引自上而下。
你的情況 所以A [1] = 1,A [2] = 4,A [3] = 7

這就是說,它會更容易在工作」,因爲它的多一點不重要的。

B = A'; 

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

從文檔:*「A( :)是A的所有元素,被視爲單個列。「*。作爲一個側面說明,以瞭解索引。 – zellus 2011-01-30 11:46:52

5

這有點難看,但diag(A(1:3,[1 2 1]))將做的伎倆。

+0

我做了同樣的事情:diag(A(:,vector))' – 2011-01-31 03:45:26

8

MATLAB提供SUB2IND功能行/列標轉換爲線性指標:

>> 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

這裏是Yochai's answer的變化,但沒有轉置(這也基本上是SUB2IND並在Amro's answer):

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

或者對於任意大小的排列A

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