Moving average - for loop vectorization

1 vue (au cours des 30 derniers jours)
Dawid Smolen
Dawid Smolen le 21 Avr 2016
Commenté : Stephen23 le 5 Déc 2018
Hello. I've got a problem that my loop doesn't execute fast enough, even though it is simple moving average. Is there any smart way to make it work faster? x is a huge array, and there is some indexing using : in every iteration, that's probably the reason.
len = length(x); % around 6000000
A = 1/200;
for n = 100+1:len-100
MA = A*sum(x(n - 100: n + 100));
% Do something with MA. However I know that the above part is the slow one
end
I was trying to find some information about vectorization, but I can't see how could I apply these methods.

Réponse acceptée

Stephen23
Stephen23 le 21 Avr 2016
Modifié(e) : Stephen23 le 21 Avr 2016
To efficiently calculate a moving average you should use conv, something like this:
>> xi = 0:0.1:2*pi;
>> yi = sin(xi)+0.4*rand(size(xi))-0.2;
>> N = 4; % length of moving average
>> yo = conv(yi,ones(1,N),'same')/N;
>> plot(xi,yi, xi,yo)
  3 commentaires
yari lazzaro
yari lazzaro le 4 Déc 2018
Hi, do you know how this solution could be adapted in case I want to calculate a moving average along the rows of a matrix? Thanks
Stephen23
Stephen23 le 5 Déc 2018
@yari lazzaro: Use conv2 with a row vector.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by