【问题标题】:MATLAB - interpolating a 2D curve with multiple Y's per XMATLAB - 用每个 X 插入多个 Y 的 2D 曲线
【发布时间】:2014-08-14 05:28:50
【问题描述】:

我想插入一个数据集,但给定的 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 中显示的曲线。

图片在这里: http://imgur.com/aYJ0Ftj

我只想为这些点拟合一条曲线,然后将该曲线转换为一系列可能有 200 个 XY 点。

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

谢谢!

【问题讨论】:

  • 你看过interp1吗?您可能需要多次调用它,我不确定您所说的每个 X 2 个或更多 Y 点是什么意思。您必须发布一个具有所需结果的示例。
  • 所以你想要一个单值函数有多个值?
  • 发布的值将显示分数。 fnplt(cscvn(squeeze(A(:,:,1))'),'r',2) 将显示样条线。
  • 我显然无法发布图片,因为我以前从未在这里问过任何问题

标签: matlab curve-fitting spline interpolation


【解决方案1】:

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

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 的唯一值限制。

【讨论】:

    【解决方案2】:

    好的,感谢 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');
    

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

    如何为你们增加声望?

    【讨论】:

    • 你已经让我明白了谢谢:)。您也许可以为 Yvon 的有用的 cmets 投票。
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多