减少这个包含多个矩阵运算的 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
,以避免额外的逐元素乘法。
我正在尝试使用以下简化的 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
,以避免额外的逐元素乘法。