MATLAB - 插值每 X 有多个 Y 的 2D 曲线



我想插入一个数据集,但是给定的X可以有多个Y,示例如下:

A(:,1:2,1)=
95.2343   70.6159
   96.4501   71.5573
   97.4430   72.7315
   98.9743   72.8699
  100.0470   71.7690
  100.3872   70.2699
  100.7797   68.7837
  102.1478   68.0814
  103.6851   68.0521
  105.0307   68.7966
  105.8972   70.0666
  106.7177   71.3665
  107.7095   72.5416
  108.9175   73.4924
  110.3574   74.0309
  111.8943   73.9859
  113.3936   73.6446
  114.6645   72.7794
  115.5911   71.5522
  116.2426   70.1591
  116.3922   68.6286
  116.3503   67.0914
  116.7771   65.6147
  117.9045   64.5692
  119.4065   64.2425
  120.9432   64.2923
  122.2526   65.0975
  122.9486   66.4682
  122.8841   68.0043
  122.5492   69.5051
  122.2403   71.0109
  122.0819   72.5402

这些是蛇身体上的点,从自上而下的视频中数字化。他们的姿势经常导致每个X有2个或更多的Y点,因为他们在我需要保持一致的XY框架时转动(通常是戏剧性的),我不能只是旋转我的X和Y。

我可以用cscvn制作样条函数,当用fnplt绘制时,它看起来很棒!但是,当我试图使用ppval获得值时,它就会崩溃,我得到两条曲线,看起来一点也不像蛇或fnplt中所示的曲线。

图像:https://i.stack.imgur.com/Os8vQ.jpg

我想要的就是将曲线与这些点拟合,并将该曲线转换为一系列可能有200个XY点的曲线。

我假设有一些非常简单的答案,一些命令,我只是在我的搜索中从未出现过,但我找不到它。这远远超出了我通常的技能范围(我更习惯于爬过沼泽捕捉任何有鳞或粘稠的东西),所以我确信我忽略了一些对熟练的MATLAB用户来说完全显而易见的东西。

谢谢!

也许这是你已经尝试过的,但是一个评论有点小,所以这里有一个想法可能会帮助你

x = [1 2 3 4 5 6 7 6 5];
y = [1 4 4 3 2 2 2 3 4];
t = 1:length(x);
figure; plot(x,y)

xx = interp1(t,x,1:.01:length(x),'pchip');
yy = interp1(t,y,1:.01:length(x),'pchip');
hold on; plot(xx,yy,'g')

我通过将x和y都作为t的函数插值来避免interp上的唯一值限制。

好的,感谢Yvon和Trogdor,我设法粗略地拼凑了一些代码:

ht=[1:32];
tx=linspace(1,32,500);
m=ht;
m(2:3,:)=squeeze(A(:,:,i))';
m1=m(1,:);
m2=m(2,:);
m3=m(3,:);
SFX=spline(m1,m2);
pSFX=ppval(SFX,tx);
SFY=spline(m1,m3);
pSFY=ppval(SFY,tx);
AS(:,1,i)=pSFX;
AS(:,2,i)=pSFY;
plot(AS(:,1,i),AS(:,2,i),'Marker','o');

它充满了无意义的变量、步骤和冗余,但我是一名解剖学家,所以这让我感到舒服(真的,谷歌一下"喉返神经")。

我如何为你们所有人增加声誉?

最新更新