我想插入一个数据集,但是给定的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');
它充满了无意义的变量、步骤和冗余,但我是一名解剖学家,所以这让我感到舒服(真的,谷歌一下"喉返神经")。
我如何为你们所有人增加声誉?