简体   繁体   English

Vectorize Triple Loop - MATLAB

[英]Vectorize Triple Loop - MATLAB

I have the following large, very inefficient loop. 我有以下大而非常低效的循环。

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

I want to compute the following loop: 我想计算以下循环:

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

Obviously this is very inefficient. 显然这是非常低效的。 I tried parfor , but I would rather a vectorized solution. 我试过parfor ,但我宁愿使用矢量化解决方案。 I tried couple of things with bsxfun , but also never managed to get it working. 我用bsxfun尝试了几件事,但也从未设法让它工作。

Thank you. 谢谢。

Here's an almost (almost because we still have a loop, but with only 5 iterations) vectorized approach using powerful matrix-multiplication - 这是一个几乎(几乎因为我们仍然有一个循环,但只有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

Runtime tests and verify output - 运行时测试并验证输出 -

%// 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(:)))

Output - 输出 -

--------------------- 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM