Hello, I have a nx5 matrix where column 3, 4 and 5 are x,y,z 3D points respectively. I was wondering how I would interpolate (smooth) this 3D data. Many thanks

4 commentaires

Stephen23
Stephen23 le 19 Avr 2016
Do you want to interpolate, or to smooth the data? These are two quite different operations.
shellmcg
shellmcg le 20 Avr 2016
Hi Stephen, I mean interpolate, construct new data points to construct a smooth curve running through the already established 3D data points. Thanks
Walter Roberson
Walter Roberson le 20 Avr 2016
What properties does the curve need to have? Are you looking for a spline fit? A pchip fit?
shellmcg
shellmcg le 20 Avr 2016
Hi Walter, I was looking at a spline fit.

Connectez-vous pour commenter.

 Réponse acceptée

John D'Errico
John D'Errico le 29 Avr 2016
Modifié(e) : John D'Errico le 29 Avr 2016

7 votes

You can use my interparc tool, as found on the file exchange. It is designed to solve exactly this problem, in 2 or more dimensions.
xyz = interparc(1000,x,y,z,'spline');
xyz will be a 1000x3 array, where each row is an interpolated point on the curve.
Of course, you can do the interpolation in other ways. If you want to do the work in MATLAB yourself in much the same way as you tried to do it:
t = [0;cumsum(sqrt(diff(x).^2+diff(y).^2+diff(z).^2))];
t = t/t(end);
ti = linspace(0,1,1000);
xx = spline(t,x,ti);
yy = spline(t,y,ti);
zz = spline(t,z,ti);
The above solution, which uses a cumulative piecewise linear arclength as the parameter for interpolation, deals more properly with points that are not uniformly spaced.

Plus de réponses (2)

Walter Roberson
Walter Roberson le 20 Avr 2016

0 votes

It looks to me as if you likely want a scattered interpolant.

2 commentaires

shellmcg
shellmcg le 22 Avr 2016
Modifié(e) : Walter Roberson le 22 Avr 2016
No I am asked to do a spline fit. Any suggestions?
This is all I got with errors
xx=linspace(matrix(1,3),matrix(end,3),1000);
yy = spline(matrix(:,3),matrix(:,4),xx);
zz = spline(matrix(:,3),matrix(:,5),xx);
Thanks

Connectez-vous pour commenter.

shellmcg
shellmcg le 28 Avr 2016

0 votes

Figured this Question out
Inter_p= linspace(1,length(Data),1000); %create a array of points within the length of the data
xx=spline(1:length(Data),x,Inter_p); % use points created above to interpolate x,y,and z
yy=spline(1:length(Data),y,Inter_p);
zz=spline(1:length(Data),z,Inter_p);

1 commentaire

John D'Errico
John D'Errico le 28 Avr 2016
Modifié(e) : John D'Errico le 29 Avr 2016
I'm sorry, but this answer is just a poor way of solving the problem, presuming the points are somehow equally spaced. Use of a spline as was done here can cause some strange artifacts.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Interpolation dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by