problem with numerical derivative using gradient function
8 views (last 30 days)
Show older comments
while using gradient i encounter a phenomenon that i cannot explain, as you can see from the example below
a=[1 2 7 9;
9 8 4 1;
1 2 3 7]
gradient(a)
ans =
1.0000 3.0000 3.5000 2.0000
-1.0000 -2.5000 -3.5000 -3.0000
1.0000 1.0000 2.5000 4.0000
i get this weird 3.5 value that is not expected all i need's a simple derivative that subtract one value with another similar to the diff function where i get this result
a=[1 2 7 9;
9 8 4 1;
1 2 3 7]
diff(a)
ans =
8 6 -3 -8
-8 -6 -1 6
the problem with diff is that i don't get the same matrix size
0 Comments
Answers (1)
Star Strider
on 15 Apr 2015
You’re only getting half the information that gradient is calculating.
Use this to get the gradient in the default (horizontal, along rows) direction as well as the vertical (along columns) direction:
[dadx,dady] = gradient(a)
The diff function takes the difference in the first dimension >1 by default. (You can specify a different dimension as the third argument.) So if a matrix, it will take the differences between rows (along columns) by default.
So if you want the output of gradient to correspond with the default output of diff, use the second output of gradient, here ‘dady’ in my code.
3 Comments
Star Strider
on 15 Apr 2015
No, there is nothing suspicious about the gradient function. (See the documentation — doc gradient — for the algorithm it uses.) It produces an accurate numerical derivative, not simply the difference between adjacent elements as diff does. If there is a specific, constant, spacing between the elements in each direction that you want to provide, gradient will use them rather than the default spacing of 1.
Michael Mauersberger
on 30 Apr 2020
I agree. Furthermore gradient calculates mean values of neighbouring differences. That is why you get a .5 value. All is written in the doc.
See Also
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!