File Exchange

image thumbnail


version 1.0 (2.53 KB) by

Smooths a 2D matrix using a mean filter over a user-defined rectangle. Ignores and preserves NaNs.



No License

Smooths 2D array data. Ignores NaN's.

function matrixOut = smooth2a(matrixIn,Nr,Nc)

This function smooths the data in matrixIn using a mean filter over a
rectangle of size (2*Nr+1)-by-(2*Nc+1). Basically, you end up replacing
element "i" by the mean of the rectange centered on "i". Any NaN
elements are ignored in the averaging. If element "i" is a NaN, then it
will be preserved as NaN in the output. At the edges of the matrix,
where you cannot build a full rectangle, as much of the rectangle that
fits on your matrix is used (similar to the default on Matlab's builtin
function "smooth").

"matrixIn": original matrix
"Nr": number of points used to smooth rows
"Nc": number of points to smooth columns. If not specified, Nc = Nr.

"matrixOut": smoothed version of original matrix


Explanation of screenshot:
The left plot is a pcolor (shading interp, axis equal) of a "jagged" 906x1024 matrix. Note that the edges have NaN values (white coloring). On the right, pcolor of output of smooth2a, with Nr = Nc = 50. NaN's are preserved, but do not affect the smoothing of adjacent elements.

Comments and Ratings (26)

Shan Dou

Arthur PINON


Do you have the 1D version?


thanks very much!

Simple and effective

can zu

can zu (view profile)

is there weights in the function?

Jeremy Parker

Works just as advertised, thank you!!

Ahmed Hussein


very good code for 2-D data smoothing

I had been searching for something that works like this for some time. Exactly what I had hoped for. Thank you!

Beichuan Hong

The function works completely as advertised.


Liem Nguyen

It works perfectly. Thank you!


Peter (view profile)

The function works completely as advertised. Thank you.

In response to JEC PsiCom's comment from 2011 (since I stumbled across the same error)... Make sure your input matrix is of type "double". My problem was solved by casting the input as a double {eg, xs = smooth2a(double(x),1);}


Kiwi (view profile)


JEC PsiCom

I get this error trying to run the code on a 2-D matrix of type double:

"MTIMES is not supported for one sparse input and one single input."

What does this mean?


Mark Novak

Thank you... this is perfectly implemented.


Jakob (view profile)

I experienced vertical and horizontal jumps when using the smooth2 procedure and spent quite a while tracking down something better when I stumbled across the list of work the smooth2 had inspired (yours being one of them). smooth2a completely resolved the issue. I thank you for this!

Wuxing Gan

very useful, I specially like its way to handle the NaN points.


Nathan (view profile)

Very slick code. Runs fast. Works Great!

Nice code, my codes moving_average.m and ndnanfilter.m do similar jobs but are written very different! Regards...

This function is what I have searched for months.
It's working great!!
My best congrats

MATLAB Release
MATLAB 7.4 (R2007a)

Inspired by: smooth2

Inspired: filt2 2D geospatial data filter

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Win prizes and improve your MATLAB skills

Play today