开发者

MATLAB indexing question

I have a matrix, for example

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

and a vector of size 1x3 which specifies which element in each row is the one I'm looking for - i.e. If

vector = [ 开发者_JAVA技巧1 2 1 ]

then the desired output is

[ 1 5 7 ]

since 1 is the 1'st element in the 1'st row, 5 is the 2'nd in the 2'nd row, and 7 is the 1'st element in the 3'rd row.

How do I achieve this? Couldn't find a built in function to do this, which surprised me.


MATLAB provides the SUB2IND function to convert rows/columns subscripts to linear indices:

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


First of all, the indexes in Matlab go from top to bottom.
So in your case A[1] = 1 , A[2] = 4 , A[3] = 7

That said, it would be easier to work on A' , because its a bit more trivial.

B = A';

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


It's a bit ugly, but diag(A(1:3,[1 2 1])) will do the trick.


Here's a variation of Yochai's answer but without the transpose (this is also basically what SUB2IND does in Amro's answer):

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

Or for an array A of an arbitrary size:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜