将interp1用于非统一查询点

时间:2015-04-17 07:24:38

标签: matlab interpolation

我想使用interp1函数在样本点之间进行(线性)插值。对于采样点之间的均匀插值,我可以使用

test = [-1 -2 0 3];
new = interp1(test,1:.5:numel(test));

将给出一个插值序列,其中新系列现在在每个原始(test)系列点之间包含一个额外的插值点。

我想要做的是,创建一个new系列,根据test系列点之间的差异进行插值。对于上面的情况,结果输出看起来像

[-1 -2 -1 0 1 2 3];

我已经完成了http://au.mathworks.com/help/matlab/ref/interp1.html的例子,但答案仍然没有找到。我很欣赏这个简单查询的方向。

1 个答案:

答案 0 :(得分:2)

interp1的一般语法是

vq = interp1(x,v,xq);

其中xv是输入,xqvq是插值向量。您使用的是较短的语法

vq = interp1(v,xq);

假设x1:length(v)

在我看来,创建一个允许您使用x进行插值的xq=1:length(vq)向量比制作x=1:length(v)和计算xq更容易。要构建正确的x向量,您可以执行以下操作:

  1. 使用diff(test)查找v值之间的差异。这将告诉您中间需要多少个插值。
  2. 我们想要使用绝对差异:abs(diff(test))
  3. 要获得相应的x值,我们可以对此结果cumsum进行1,从cumsum([1, abs(diff(test))]);开始。那就是:test。对于[1 2 4 7]输入,这给了我们:-1这似乎是正确的:-2-2之间没有其他值,0和{{1之间的一个值最后是03之间的两个值。
  4. 我们可以将此向量用作x,然后将向量xq作为所有元素从1到x中的最大值:

    x = cumsum([1, abs(diff(test))]);
    xq = 1:max(x);
    

    然后我们可以进行插值:

    vq = interp1(x,test,xq);
    

    给了我们

    vq = 
       -1   -2   -1    0    1    2    3