Hi guys,
I have some 3D points of a 3D surface in x, y and z format. You can get the points here: http://textuploader.com/?p=6&id=EjEtc
Assuming 'M' is my 3D surface (i.e. made up of the 3D points), I would like to get the derivative of M with respect to the 'x' direction and the 'y' direction. That is, I want to differentiate M wrt to the x and y coordinates (i.e. gradient in x and y directions).
My data is not a uniform grid. Any ideas how to do this in Matlab ?

 채택된 답변

dpb
dpb 2013년 10월 11일

0 개 추천

See
doc gradient
maybe? Look at alternate syntax with spacing inputs not just minimum case.

댓글 수: 7

dpb,
To get a better undetanding of my problem. Here is my code which does the desired differentiation, but on a uniform XYZ grid. I have no idea how to adapt this for the non-grid 3D data I posted in the 1st post.
function Run_Differentiate_3D()
clc;clear all;close all
% Generate data
[X2,Y2] = meshgrid(-2:.2:2, -2:.2:2);
% surf(X,Y,Z)
X2= X2(:);
Y2 = Y2(:);
Z2 =zeros(size(X2),1) ;
% data here is a Grid
Surface_3D = [X2 Y2 Z2];
% Cx is derivative wrt to x coordinates, likewise Cy for y coords.
[Cx,Cy]=SurfaceGrad3D(Surface_3D);
end
function [Cu,Cv]=SurfaceGrad3D(x)
r=size(x,1);
c=size(x,2);
Cu=spalloc(r*c,r*c,r*c*2);
Cv=spalloc(r*c,r*c,r*c*2);
for j=1:c-1
for i=1:r
Cu((c-1)*r+i,(c-1)*r+i)=1;
Cu((c-1)*r+i,(c-2)*r+i)=-1;
Cu((j-1)*r+i,(j-1)*r+i)=-1;
%
Cu((j-1)*r+i,(j)*r+i)=1;
%Cu((c-1)*r+i,(c-2)*r+i)=-1;
% Cu((j-1)*r+i,(j-2)*r+i)=-1;
%Cu((j-1)*r+i,(j)*r+i)=1;
end;
end;
for i=1:r-1
for j=1:c
Cv((j-1)*r+r,(j-1)*r+r)=1;
Cv((j-1)*r+r,(j-1)*r+r-1)=-1;
Cv((j-1)*r+i,(j-1)*r+i)=-1;
Cv((j-1)*r+i,(j-1)*r+i+1)=1;
%Cv((j-1)*r+i,(j-1)*r+i-1)=-1;
% Cv((j-1)*r+i,(j-1)*r+i+1)=1;
end;
end;
end
dpb
dpb 2013년 10월 11일
Perhaps interp2 the data to a uniform grid and do the gradient there and then back to the sampled points?
What's the end result to be for?
Kurt
Kurt 2013년 10월 12일
dpb,
Please see the following link for what I am trying to do and my end result:
Essentially, I want to compute the Equation 1, Es(M). Where M is my 3D surface points. According to the code I posted above, I get dM/du and dM/dv, so the 3 differential terms of Equation 1 can easily be computed. But again, it assumes my 3D data is grid.
Assuming I given non-grid XYZ data, I want to compute Es(M). I dont really want to manipulate my original data by adding extra points through interpolation. Please let me know of any ideas.
thank you
dpb
dpb 2013년 10월 12일
If you can't generate a regular grid it's pretty difficult to envision how you'd do just a numerical difference. I guess I'd be for looking to fit a spline and do the gradients analytically, then.
Kurt
Kurt 2013년 10월 12일
dpb,
can you tell me a bit more on fitting the spline an analytical grad? thanks
Kurt
Kurt 2013년 10월 12일
dpb
dpb 2013년 10월 12일
편집: dpb 2013년 10월 13일
Dunno--give it a go and see...you'll have to see what its assumptions are on data ordering, etc., ...
On the spline, if the data are a (relatively) smooth surface, the idea is that a piecewise cubic poly should be a good representation of same. Since it's a poly of low order, one can analytically compute the derivatives from the coefficients.
For globally-smooth data, response surfaces are often used as well for the same purpose or to reduce high-complexity models to simply-evaluated RSMs for such purposes as MC simulation where the actual evaluation would be excessively costly.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Splines에 대해 자세히 알아보기

질문:

2013년 10월 11일

댓글:

dpb
2013년 10월 12일

Community Treasure Hunt

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

Start Hunting!

Translated by