MATLAB Answers

# How can I differentiate without decreasing the length of a vector?

224 views (last 30 days)
Javad on 18 Jul 2014
Commented: John D'Errico on 10 Mar 2020
I have some vectors and want to differentiate them up to second order. I don't want to use "diff" because it reduces the length of vector in higher orders! Is there any other function or method that I differentiate and keep the length of vector constant?
##### 0 CommentsShowHide -1 older comments

Sign in to comment.

### Accepted Answer

Jan on 18 Jul 2014
gradient is smarter for calculating derivatives:
x = rand(1, 100);
d2 = gradient(gradient(x));
The Savtizky Golay smoothing filter can be applied to calculate a smoothed derivative by fitting polynmials to local parts of the signal. Look in the FileExchange for many different submissions:
##### 1 CommentShowHide None
John D'Errico on 10 Mar 2020
Jan is correct, of course. I might only add one idea, to fit the data using a smoothing spline, then differentiate the spline, and evaluate the derivative spline at the original data points.
spl = csaps(x,y);
spld = fnder(spl);
yprimepred = fnval(spld,x);
As I've done it here, this uses tools from the curve fitting toolbox, though there are alternative ways to implement it too.

Sign in to comment.

### More Answers (1)

Daniel kiracofe on 18 Jul 2014
My standard approach is to use 2nd order centered difference for the main part of the vector, and use first order forward and backward difference at the boundaries:
function d = cdiff(x, dt)
if (nargin<2)
dt =1 ;
end
d(1) = (x(2) - x(1)) / dt;
d(length(x)) = ( x(end) - x(end-1) ) / dt;
ndx = 2:(length(x)-1);
d(ndx) = (x( ndx+1) - x(ndx-1)) / (2 * dt);
##### 1 CommentShowHide None
rnayek on 10 Mar 2020
That is what the function in MATLAB does too!

Sign in to comment.

### Community Treasure Hunt

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

Start Hunting!