您可能已经知道,您应该在循环之前预先分配p:
p = zeros(Z, nR);
这可以防止数组p在每次迭代时增长,从而极大地加速循环.
你可以通过bsxfun对整个事物进行矢量化:
% C ≣ M×N×R array of all products Rmn·J0m
C = bsxfun(@times, Rmn, J0m);
% D ≣ M×N×R×Z array of all products C·sinanz
D = bsxfun(@times, C, permute(sinanz, [3 1 4 2]));
% Sum in M and N directions, and re-order
p = permute(sum(sum(D,1),2), [4 3 1 2]);
但我怀疑它会更快; MATLAB(读取:BLAS)与2D矩阵相当快,但对于更多D阵列通常不是很好.
我建议你阅读约bsxfun;它也是以你描述的方式将J0m数组减少到M×R的方法.
当然,你可以通过正确定义你的变量来摆脱这种变换,所以让我们在循环代码和矢量化代码的“理想”版本中做一个小测试:
%% Initialize some variables
% Number of tests
TESTS = 1e4;
% Your dimensions
M = 5; nR = 4;
N = 2; Z = 3;
% Some dummy data
Rmn = rand(M,N);
sinanz = rand(N,Z);
J0m = rand(M,nR); % NOTE: J0m d