将 interp1 用于非统一查询点

Using interp1 for non-uniform query points

我想使用 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 中的示例,但我仍然找不到答案。如果能为这个简单的查询提供一点指导,我将不胜感激。

interp1 的一般语法是

vq = interp1(x,v,xq);

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

vq = interp1(v,xq);

其中 x 假定为 1:length(v)

在我看来,创建一个允许您使用 xq=1:length(vq) 进行插值的 x 向量比创建 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 和 [=39 之间有一个值=],最后是 03.
  4. 之间的两个值

我们可以把这个向量作为x,然后得到向量xq作为x中从1到最大值的所有元素:

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

然后我们可以进行插值:

vq = interp1(x,test,xq);

这给了我们

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