您可以使用最好的矢量化工具,bsxfun here -
B = A(bsxfun(@plus,[1:M]',M*(0:N-1)) + M*N*(g-1))
说明:将其分解为两个步骤
Step #1:计算对应于前两个维度(行和列)的索引A
-
bsxfun(@plus,[1:M]',M*(0:N-1))
Step #2:添加包含所提供的 dim-3 索引所需的偏移量g
并用这些索引索引 A 以获得我们想要的输出 -
A(bsxfun(@plus,[1:M]',M*(0:N-1)) + M*N*(g-1))
标杆管理
这是一个快速基准测试来比较这个bsxfun
基于方法反对ndgrid + sub2ind
基于解决方案中提出的路易斯的解决方案 with M
and N
as 100
.
基准测试代码使用tic-toc
看起来像这样 -
M = 100;
N = 100;
A = rand(M,N,M);
g = randi(M,M,N);
num_runs = 5000; %// Number of iterations to run each approach
%// Warm up tic/toc.
for k = 1:50000
tic(); elapsed = toc();
end
disp('-------------------- With BSXFUN')
tic
for iter = 1:num_runs
B1 = A(bsxfun(@plus,[1:M]',M*(0:N-1)) + M*N*(g-1)); %//'
end
toc, clear B1
disp('-------------------- With NDGRID + SUB2IND')
tic
for iter = 1:num_runs
[ii, jj] = ndgrid(1:M, 1:N);
B2 = A(sub2ind([M N M], ii, jj, g));
end
toc
这是运行时结果 -
-------------------- With BSXFUN
Elapsed time is 2.090230 seconds.
-------------------- With NDGRID + SUB2IND
Elapsed time is 4.133219 seconds.
结论
如你看到的bsxfun
基于方法的效果非常好,既作为矢量化方法,又具有良好的性能。
Why is bsxfun
这里更好-