2016-11-09 71 views
1

A的大小为[n,m],即它具有n行和m列。鉴于I的大小[n,1]max(I)<=m什么是最快的方式来返回B大小[n,1],这样B(i)=A(i,I(i))按照矢量指定列的Matlab索引矩阵

例子:

A = 
8  1  6 
3  5  7 
4  9  2 

I = 
1 
2 
2 

我想B看起来像

B = 
8 
5 
9 

有明显存在多种方法来实现这一点,但对我来说n1e6和的顺序的顺序为1e2,这就是为什么我对最快实施感兴趣。我想避免ind2subsub2ind,因为它们看起来都太慢了。任何想法非常感谢!谢谢!

+0

那么,它是'sub2ind'或循环 –

回答

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

您也可以使用这样的事情:

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

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