2016-11-09 111 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