我有一个矩阵a,它看起来像这样:
A = [ 5 6 ; 7 8; 9 10 ]
A =
5 6
7 8
9 10
然后是一个向量e,它指示我想为每行选择哪一列:
e = [ 1 ; 2 ; 1]
解释为,从A的第1行,我想选择第一列;从第2行到第2行;从第3行再次到第1行。
我想我会做
A(e)
它给出
A(e)
ans =
5
7
5
而我想要的是
5
8
9
我如何才能最有效地做到这一点?我的实际矩阵包含近100万行,所以for循环不是一个选项。非常感谢。
这里有两个选项。
MATLAB的sub2in从行&线性索引的列下标索引:
linear_indices = sub2ind(size(A), (1:size(A,1))', e);
A(linear_indices)
自己计算:
linear_indices = (1:size(A,1))' + (e-1)*size(A,1);
A(linear_indices)
使用arrayfun
有一种简单的方法,它需要两个参数:从1到3的行索引和列索引e
arrayfun( @(i,j) A(i,j) , (1:size(A,1))' , e )
我认为这个答案和@marsei的优秀答案是一样的,但为了完整性,我无论如何都会添加这个:
A = [ 5 6 ; 7 8; 9 10 ];
e = [ 1 ; 2 ; 1];
for i=1:length(e)
B(i)=A(i,e(i));
end
>> B
B =
5 8 9
请注意,这将返回一个行向量,因此还需要使用B'
进行转置,或者通过在使用B=nan(size(e));
的循环之前进行预分配。