Matlab索引矩阵按矢量指定列

时间:2016-11-09 15:42:33

标签: matlab indexing

A的大小为[n,m],即它有n行和m列。如果I的{​​{1}}大小为[n,1],那么返回max(I)<=m大小为B的最快方式是什么,[n,1]

示例:

B(i)=A(i,I(i))

A =
 8     1     6
 3     5     7
 4     9     2

我希望I = 1 2 2 看起来像

B

显然有几种方法可以实现这一点,但在我的情况下,B = 8 5 9 的顺序为n1e6,顺序为m,这就是为什么我对最快的实施感兴趣。我想避免使用1e2ind2sub,因为它们看起来都太慢了。任何想法都非常感谢!谢谢!

2 个答案:

答案 0 :(得分:2)

您可以自己复制sub2ind的行为。这让我在测试中获得了加速:

clear

%% small example
A = rand(4,6)
I = [3 2 2 1]

inds = (I-1)*size(A,1) + (1:length(I));
B = A(inds)

%% timing
n = 1e4;
m = 1e2;
A = rand(n, m);
I = ceil(rand(1,n) * m);

% sub2ind
F = @() A(sub2ind(size(A), 1:size(A,1), I));
timeit(F)

% manual
F = @() A((I-1)*size(A,1) + (1:length(I)));
timeit(F)

答案 1 :(得分:0)

您也可以使用以下内容:

 A(meshgrid(1:size(A,2),1:size(A,1)) == repmat(I,1,size(A,2)))

会给你相同的结果,没有循环,没有sub2ind