File Exchange

image thumbnail

Fast 'n easy smoothing

version 2.1.1 (27.4 KB) by

SMOOTHN allows automatized and robust smoothing in arbitrary dimension w/wo missing values

37 Ratings



View License

Editor's Note: This file was selected as MATLAB Central Pick of the Week

SMOOTHN provides a fast, unsupervised and robust discretized spline smoother for data of arbitrary dimension.
SMOOTHN(Y) automatically smoothes the uniformly-sampled array Y. Y can be any N-D multicomponent noisy array (e.g. time series, images, 3D data, 3D vector fields, tensors...).
To smooth a vector field or multi-component data, Y must be a cell array. For example, if you need to smooth a 3-D vectorial flow (Vx,Vy,Vz), use Y = {Vx,Vy,Vz}. The output Z is also a cell array which contains the smoothed components.
SMOOTHN can deal with missing (NaN) values (see screenshot and examples).
SMOOTHN(...,'robust') carries out a robust smoothing that minimizes the influence of outlying data (see screenshot and examples).
SMOOTHN is made automated by the minimization of the generalized cross-validation score.
Enter "help smoothn" in the Matlab command window for complete instructions and 1-D to 3-D examples.
When using this algorithm, please refer to these 2 papers:
1) Garcia D. Robust smoothing of gridded data in one and higher dimensions with missing values.
Comput Statist Data Anal, 2010;54:1167-1178
2) Garcia D. A fast all-in-one method for automated post-processing of PIV data.
Exp Fluids, 2011;50:1247-1259.

Comments and Ratings (43)


zjxugd (view profile)


Hinduf (view profile)

Very nice. Many thanks

Hi Damien, Is there any minimum and maximum value for the smoothing parameter S used?

Dang Le Van

Just used a part of the code. Very clear instruction. Well done! Thanks for sharing.

Thanks to Damien Garcia for your robust and fast function for smooting.

This function is gold! Would be largely helpful for the scientific community across different disciplines.

Perfect ... !!! Robust and fast function for smoothing.


works great and very smoothly :)

Ned Gulley

Ned Gulley (view profile)

I featured this file in a blog post about how to write good help for your function. Thanks and well done!

Brian McFall

Works great and it's easy to adjust the robustness of the smoothing function.

Kevin Miller

Stephan Koehler

I'm trying to run this on large data sets, which crashes my computer. Is there any way to chunk it, i.e. break up say a 1000x1000x1000 array into pieces and merge the smoothened pieces?

Zhouxin Xi



ogadol (view profile)

Hi Damien

Im applying smoothn in order to smooth bathmetric data sets and it works perfectly. I'm using a smooth factor of 10^9 on a 1601X1601 grid. The spacing of the points in realty is 12.5 m. can you please tell me what is the spatial meaning of the smooth factor in my case ?



Works fine for me!

John Booker

Matteo Niccoli

Jospeh Chang


arnold (view profile)

hey Damien,

is there a way to suppress filling of missing values (nans to be specific)? it'd be really useful if this were an option.


Tete Tevi

Really nice tool, thank you.


Ben (view profile)

Hi Damien,
What if I have non-uniformly sampled array? Could it be possible to us this function? Currently, I found the smoothed curve did not maintain the start and end points in 3D. The smoothed curve looks being shrunk.

Super tool for smoothing!


Ben (view profile)

Thanks for sharing!! This is really a nice pice of code.


What is with the "DCTN and iDCTN are required"? I was able to access them outside the MatLab browser, but not from within it.


Jakub Wosyka

Hello Damien,
very useful and nice function.
I tried to add the non-uniform grid (x values) according to your article but then it only interpolates the data. When I raise the value of smooting parameter, new the function will fall to zero (zero mean). (...probably my fault...). Do you plan to extend this nice function for non-uniform grids? Thank you


Erik (view profile)

Really nice method!

I does seem to me though that there is a bug when using this in combination with your pppiv-function.

In the function RobustWeights, there is a line:
MAD = median(abs(r(I)-median(r(I))));

However, the values of r are complex when using it together with pppiv. That causes the median function to sort the values by the real component and then take the middle value. I think you probably want to add
r = abs(r);
before taking the median to sort the residuals by magnitude instead. Is that correct?


Well done! well documented. very easy to use.


I like this function very much...I do have a question though. I am smoothing a 50x50x3 n-d array but after smoothing my 3-d object is much flatter than the original. it almost seems distorted...has this ever happened to you before?


Very good!. Minor effort to obtain dctn and idctn but this is an easy way to smooth out "zigzag" contours (much better than going with INTERP2( Array, ntimes)).
thank you.

Damien Garcia

Damien Garcia (view profile)

to Matthew: you should have read the File description:
MATLAB release: MATLAB 7.5 (R2007b)
BSXFUN is nonexistent in versions prior to 7.4!
Regards. DG

Code does not work out of the box for MATLAB 7.1 - at least I was unable to get it to function. Attempted a test case and got this error:

??? Undefined function or method 'bsxfun' for input argument of type 'function_handle'.

Error in ==> smoothn at line 266
    Lambda = bsxfun(@plus,Lambda...

If some special set-up is required to make this code run successfully, this needs to be carefully documented.

Mark Shore

Mark Shore

Definitely very interesting looking. Well referenced with a range of 1, 2 and 3D examples, which work quite well. I'll rate this once I've had a chance to look at it in more detail.

However the author should correct the required products listing since the image processing toolbox is NOT a requirement per se. All of the provided test examples work perfectly without it. A call to bwdist to replace NaNs in supplied data defaults gracefully to another option if the image processing toolbox is not installed. And rgb2gray and imnoise are required only to _create_ the example of the noisy Saturn image given above, not to denoise it.

It would also be convenient for the author to include his subroutines dctn.m and idctn.m in the FEX file if possible, rather than requiring a separate download from an external web site.

Rob Campbell

Rob Campbell (view profile)

This is nice!

Jan Simon

Jan Simon (view profile)

H1 line, really descriptive help, examples, date and author mentioned, comments in the code, referenced method, and finally it works well.


Good job!





minor updates: 1) use narginchk, 2) two warning messages slightly modified


minor update: 1) use narginchk, 2) some warning messages slightly modified


I noticed a minor error in one comment






Some modifications in the help text


To simplify the syntax, the termination parameters are now in a structure (OPTIONS).


Numerical adjustment in the leverage (for robust smoothing) in the case of unequal spacing increments.


SMOOTHN, by default, assumes that the spacing increments are constant and equal in all the directions (i.e. dx = dy = dz = ...). Spacing increments that differ from one direction to the other can now be used (enter "help smoothn" for details).


There was a non negligible bug in the new SMOOTHN function:
d = ndims(y) => d = ndims(y{1})
Many thanks to Gianni Pedrizzetti.


Update of the help text


A minor bug in the "Initial Guess" criterion has been removed


A bug was present when dealing with complex numbers


A small bug was present in the subfunction InitialGuess (Thank you Jonathan!)


One bug has been fixed.


SMOOTHN now works with multicomponent data (e.g. 3D vector fields) by using cell arrays. See the help text for details.


DCTN and IDCTN are now included in SMOOTHN


some typos


3 optional weighting functions


3 optional weighting functions


minor modifications: mlint messages removed


Some options have been removed/added


fix a minor bug with the warning messages


Minor modification in the relaxation factor


A minor bug in error(nargchk(...))


Gamma was undefined when "isauto" variable was false.


The link to the manuscript has been modified.


A bug has been reported with a smoothness parameter input. Thank you B.S.


Very much faster now with weighted/missing data:
1) SOR
2) Initial guess from nearest-neighbor interpolation
3) GCV score is minimized every 2^k iterations (k = 0...)


The "upsample" option has been removed


An example has been added

MATLAB Release
MATLAB 9.0 (R2016a)

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

» Watch video