Code covered by the BSD License

### Highlights from Moving window standard deviation

4.72727

4.7 | 11 ratings Rate this file 73 Downloads (last 30 days) File Size: 2.46 KB File ID: #9428

# Moving window standard deviation

21 Dec 2005 (Updated )

A (fast) windowed std on a time series

File Information
Description

Occasionally I see a request for computation of a running, windowed standard deviation. This is easily accomplished using filter and the alternative formula for the standard deviation:

std = sqrt((sum(x.^2) - n*xbar.^2)/(n-1)).

Movingstd allows you to specify forward, backward or central windows of any desired length. It patches the ends, shortening the window as necessary.

Acknowledgements

This file inspired Slidefun (V4.0, Sep 2008).

MATLAB release MATLAB 7.0.1 (R14SP1)
14 Feb 2014

Sorry my mistake

14 Feb 2014

The vector s contains all NaN. Probably the file needs an update for the newest MATLAB version.

28 Jan 2014

Keith - I just submitted a fix for that case. The new version should appear online in the morning. It happens because the result was essentially zero for some elements, but floating point arithmetic errors can drive a value less than zero, then a sqrt is taken.

28 Jan 2014

Great function, but I just ran into a complex standard deviation. Not sure if it's my end or not.

22 Jan 2014

Lennart - No, filter definitely does not assume that. However, nothing stops you from using this code as is with a minor trick.

1. Copy the correct number of points (based on the window size) at each end of the series to the other end.

2. Compute the windowed SD

3. Delete the created end point values.

22 Jan 2014

If my series are periodical, the ends meet and the special case defined in this function is not correct. Does the filter function assume this and can I just delete the special case part?

02 Aug 2012
07 May 2011

Nayomi - If x is an image, I assume that you mean it is an array. Note that this function is defined explicitly for use on vector input x. If you desire to use it on each row (or column) of an array, you would use an external loop over the rows or columns.

07 May 2011

I used this function as follows.
Image for x.
k=7
windowmode=backward
I= movingstd(x,k,windowmode)

07 May 2011

Following error is generated while executing this code.
Error in ==> movingstd at 89
x = x - mean(x);

Please Can you suggest a solution for this problem.

17 Jun 2010

I'm unsure what is meant here. The behavior of filter at the edges is not material, since I explicitly repair those elements along the edges as is appropriate. This is already noted in the help:

% All windowmodes adjust the window width near the ends of
% the series as necessary.

The internal comments also indicate what was done to repair the behavior of filter at the ends.

So I think/thought that this question is already covered, but perhaps the help should be more explicit to reflect what is done. I'll submit a new version that does this.

17 Jun 2010

Very nice. Performs as advertised, and quickly!
Is a reflection condition imposed implicitly by "filter.m" at the edges ? If so it would be nice to mention, just so that users are aware of all assumptions.

24 Sep 2009

Simplest is to replace the nans by interpolation. Use my inpaint_nans (also on the file exchange) to do this. Then apply this code to compute the moving standard deviation. High variance sections of the curve will still be high variance after this process. The virtue of this scheme is that both parts are fully vectorized codes.

The alternative is to use a loop, computing a windowed standard deviation on varying numbers of points by excluding the nan elements. This scheme may be tripped up if you have enough nan elements. Of course, with very many nan elements, no scheme will be perfect.

24 Sep 2009

This is just what I need except I have NaNs in my timeseries...how can I deal with these?

11 Sep 2009
20 Aug 2009
23 Jul 2007
09 Jun 2007

fantastic.. just saved me a few hours!

22 Mar 2007

16 Aug 2006
21 Dec 2005

Neat