让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
的顺序为n
和1e6
,顺序为m
,这就是为什么我对最快的实施感兴趣。我想避免使用1e2
或ind2sub
,因为它们看起来都太慢了。任何想法都非常感谢!谢谢!
答案 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
。