performance - 向量化三重循环 - MATLAB

标签 performance matlab vectorization processing-efficiency bsxfun

我有以下大而低效的循环。

P is a [2000 x 200 x 5] matrix
D is a [2000 x 200 x 5] matrix
S is a [200 x 1005] matrix
PS is a [2000 x 1000 x 5] matrix

我想计算以下循环:

for k=1:2000
   for n=1:200
      for t=1:5
          P(k,n,t) = sum(S(n,t+1:t+1000) .* PS(k,1:1000,t));
      end
   end
end

显然这是非常低效的。我尝试了 parfor,但我更愿意使用矢量化解决方案。我用 bsxfun 尝试了一些东西,但也从未设法让它工作。

谢谢。

最佳答案

这是一个几乎(几乎是因为我们仍然有一个循环,但只有 5 次迭代)矢量化方法,使用 powerful matrix-multiplication -

out = zeros(2000,200,5);
for t=1:size(P,3) %// size(P,3) = 5
    out(:,:,t) = PS(:,:,t)*S(:,t+1:t+1000).';
end

运行时测试和验证输出 -

%// Inputs
D = rand(2000,200,5);
S = rand(200,1005);
PS = rand(2000,1000,5);

disp('--------------------- No Matrix-mult-fun')
tic
P = zeros(2000,200,5);
for k=1:2000
   for n=1:200
      for t=1:5
          P(k,n,t) = sum(S(n,t+1:t+1000) .* PS(k,1:1000,t));
      end
   end
end
toc

disp('--------------------- Fun fun Matrix-mult-fun')
tic
out = zeros(2000,200,5);
for t=1:size(P,3) %// size(P,3) = 5
    out(:,:,t) = PS(:,:,t)*S(:,t+1:t+1000).';
end
toc

error_val = max(abs(P(:)-out(:)))

输出-

--------------------- No Matrix-mult-fun
Elapsed time is 70.223008 seconds.
--------------------- Fun fun Matrix-mult-fun
Elapsed time is 0.624308 seconds.
error_val =
     1.08e-12

关于performance - 向量化三重循环 - MATLAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34129644/

相关文章:

mysql - 大量选择的存储引擎

Java:有什么办法可以加快这个替代品的速度吗?

c++ - 将很多符号表达式从 x^2 或 x^3 转换为 pow(x,n)

matlab - 调试 MATLAB : Break before an error at certain line

matlab - 如何在 Matlab 中用窗口循环矩阵

performance - gslshell(基于 lua)返回 0/0 ==0/0 true

sql-server - CTE 与 SQL Server 中的 View 性能

Matlab 在一个轴上具有不同颜色的网格线

c - 如何克服icc中的 "existence of vector dependence"

r - 关于摆脱循环的建议