Why is the vectorized calculation is slower?

1 次查看(过去 30 天)
The first part of the script is the vectorized form of the second part, but the second part is much faster (2 or 3 orders of magnitude). Why?
N = 10000000;
block = [0 1 1 0 0 0 1 0 0 1];
X = repmat(block,1,N);
N = length(X);
tic;
IND0 = (X==0);
IND1 = not(IND0);
Y = nan(1,N);
Y(IND0) = cos(X(IND0));
Y(IND1) = sin(X(IND1));
result = prod(Y);
toc;
clear all
N = 10000;
block = [0 1 1 0 0 0 1 0 0 1];
X = repmat(block,1,N);
N = length(X);
tic;
result = 1;
for i = 1:N
if X(i) == 0
result = result*cos(X(i));
else
result = result*sin(X(i));
end
end
toc;

回答(1 个)

Matt J
Matt J 2017-5-10
编辑:Matt J 2017-5-10
You are using different N in each test.
Also you allocate a lot more memory in version 1 and this takes a lot of time. Version 1 creates at least 5 large arrays IND0, X(IND0), X(IND1), cos(X(IND0)), and sin(X(IND0)), whereas the 2nd version allocates no memory at all.
  3 个评论
Matt J
Matt J 2017-5-11
编辑:Matt J 2017-5-11
but this is alway a problem during vectorization of for cycles
It is a problem, which is why it is hard to know sometimes whether vectorized code or a loop will be better.
Usually, though, the thing that slows down loops is that in each iteration, you are allocating significant memory or calling non-optimized, non-builtin functions. In your case, none of that is true.
Is it possible to vectorize better?
It's hard to know from your example, because it is obviously artificial. I believe the most efficient method for this example is,
n=numel(X)-sum(X);
result=sin(1)^n;
Jan
Jan 2017-5-11
If N is chosen the same for both cases, I get with N=1e6: 0.566 sec for the vectorized code and 0.762 for the loop. For larger arrays the vectorized code can exceed the available RAM and swapping to disk will slow down the processing massively.

请先登录,再进行评论。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by