Code covered by the BSD License  

Highlights from

5.0 | 5 ratings Rate this file 30 Downloads (last 30 days) File Size: 12.5 KB File ID: #29887 Version: 1.0
image thumbnail



Jan Simon (view profile)


Gradient of arrays as fast C-Mex

| Watch this File

File Information

Gradient along a specified dimension

Y = DGradient(X, Dim, Spacing, Method)
  X: Real DOUBLE array, any number of dimensions.
  Spacing: Scalar or vector of the length SIZE(X, Dim).
  Dim: Dimension to operate on.
       Optional, default: 1st non-singelton dimension.
  Method: String, order of the applied method for unevenly spaced X:
       '1stOrder', faster centered differences as in Matlab's GRADIENT.
       '2ndOrder', 2nd order accurate centered differences.
       On the edges forward and backward difference are used.
       Optional, default: '1stOrder'.

  Y: Gradient of X, same size as X.

There are a lot of other derivation tools in the FEX. This function is faster (e.g. 25% faster than dqdt and 10 to 16 times faster than Matlab's GRADIENT), works with multi-dim arrays, on a specific dimension only, and can use a 2nd order method for unevenly spaced data.
For vectors or evenly spaced data no temporary memory is needed. Otherwise 1 or 3 temporary vectors of SIZE(X, Dim) are used for the 1st and 2nd order methods.

The C-Mex file must be compiled at first. Pre-compiled files for Win32 can be downloaded at:
Run the unit-test function uTest_DGradient to check the integrity and measure speed.

Tested: Matlab 6.5, 7.7, 7.8, WinXP, 32bit
Compiler: LCC2.4/3.8, BCC5.5, OWC1.8, MSVC2008
Assumed Compatibility: higher Matlab versions, Mac, Linux, 64bit

Thanks to Robert A. Canfield (central_diff, #12) and Darren Rowland (diffxy, #29312).


Central Diff.M, Derivative: Central Difference Approximation, Movingslope, Derivative, and Diffxy inspired this file.

MATLAB release MATLAB 7.8 (R2009a)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (8)
02 Feb 2015 Jan Simon

Jan Simon (view profile)

@mehrnaz baradaran: The C-file must be compiled before it can be used, as described in the help section. If you do not want to install a compiler, you can download a pre-compiled MEX-file from the mentioned download page. Then only the MSVC-distributables might be needed, if you did not install them with any other software before.

Comment only
31 Jan 2015 mehrnaz baradaran

how could i use this file?
it conclude 3 file 2 of them is fuction and the other one doesnt run

Comment only
09 Oct 2013 Yair Altman

Yair Altman (view profile)

Yet another excellent utility by Matlab veteran Jan Simon. Works splendidly out-of-the-box on my Win7 x64 R2013b with Microsoft SDK 7.1, achieving a x15 speedup over gradient() in my specific case.

I expect the speedup to be even higher in multi-dimensional cases, due to DGradient's smart avoidance of calculating unnecessary dimensions (unlike gradient).

The addition of multi-threading and AVX/SSE2 support, which are listed in the utility's TODO list, promise even higher speedups.

I liked the C source-code: it is well documented and highly optimized for speed (e.g., use of register variables, efficient loops and code branches). Anyone who wishes to learn how to write efficient Mex code would do well to investigate this source code.

One minor issue: the internal documentation still mentions dim as the second input arg and Spacing as the third, but I think it should be the reverse. In practice, DGradient(data,spacing) works well.

17 May 2013 SN

SN (view profile)

Great Job! thanks.

12 Jul 2012 Heinrich

Heinrich (view profile)

31 Jul 2011 Zhijun Zhang

This is an awesome code, I have used this function in my project to replace the Matlab gradient function to calculate 2D and 3D image gradient. The executing time is increased by 16 times than 'gradient' function. Thanks Simon!

10 Jun 2011 G. Sken

G. Sken (view profile)

much faster than matlab gradient() !

28 May 2011 Jan Simon

Jan Simon (view profile)

The order of arguments is DGradient(X, Spacing, Dim, Method) in opposite to the documentation. The submission is updated soon.

Comment only

Contact us