减少这个包含多个矩阵运算的 Matlab 循环的执行时间的技巧

Tips to reduce the execution time of this Matlab loop containing several matrix operations

我正在尝试使用以下简化的 Matlab 代码计算矩阵 Y(p,k)Z(p,k)

它们依赖于一些我可以预先计算的矩阵 A(j,k)B(j,p)C(j,k),所以我刚刚将它们初始化为这个 MWE 的随机数组。 (请注意,B 的尺寸与 A 和 C 不同)。

Nj = 5000;
Nk = 1000;
Np = 500;  % max loop iterations

A = rand(Nj,Nk);  % dummy precalculated matrices
B = rand(Nj,Np);
C = rand(Nj,Nk);

Y = zeros(Np,Nk); % allocate storage
Z = zeros(Np,Nk);

tic
for p = 1:Np
   
    X = A .* B(:,p);
    Y(p,:) = sum( X , 1 ); 
    Z(p,:) = sum( C .* X , 1 );
    
end
toc    % Evaluates to 11 seconds on my system

如上所示,我通过遍历索引 p 来重复我的计算(因为矩阵 B 取决于 p)。

我已经通过将可以预先计算的所有内容移到循环外(包含在 A、B 和 C 中)设法做到了这一点,但在我的系统上,这段代码仍然需要大约 11 秒才能执行。任何人都可以在 Matlab 中找到加快速度的方法,或者甚至可以删除循环并一次处理所有内容吗?

谢谢

我认为以下应该是等效的并且更快:

Y = B' * A;
Z = B' * (A.*C);

备注:

  • 如果 B 是复数,那么您应该使用 .' 进行转置。
  • 您可能还想直接以转置形式预先计算 B(即作为 Np x Nj 矩阵)以避免完全转置。
  • 如果其他任何地方都不需要 C,则将其预先计算为 A.*C,以避免额外的逐元素乘法。