将 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);
其中 x
和 v
是输入,xq
和 vq
是插值向量。您正在使用更短的语法
vq = interp1(v,xq);
其中 x
假定为 1:length(v)
。
在我看来,创建一个允许您使用 xq=1:length(vq)
进行插值的 x
向量比创建 x=1:length(v)
并计算 xq
更容易。要构建正确的 x
向量,您可以执行以下操作:
- 使用
diff(test)
找出 v
值之间的差异。这会告诉您中间需要多少个插值。
- 我们要使用绝对差异:
abs(diff(test))
。
- 要获得相应的
x
值,我们可以对这个结果执行 cumsum
,从 1
开始。即:cumsum([1, abs(diff(test))]);
。对于 test
输入,这给了我们:[1 2 4 7]
这似乎是正确的:-1
和 -2
之间没有附加值,-2
和 [=39 之间有一个值=],最后是 0
和 3
. 之间的两个值
我们可以把这个向量作为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
我想使用 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);
其中 x
和 v
是输入,xq
和 vq
是插值向量。您正在使用更短的语法
vq = interp1(v,xq);
其中 x
假定为 1:length(v)
。
在我看来,创建一个允许您使用 xq=1:length(vq)
进行插值的 x
向量比创建 x=1:length(v)
并计算 xq
更容易。要构建正确的 x
向量,您可以执行以下操作:
- 使用
diff(test)
找出v
值之间的差异。这会告诉您中间需要多少个插值。 - 我们要使用绝对差异:
abs(diff(test))
。 - 要获得相应的
x
值,我们可以对这个结果执行cumsum
,从1
开始。即:cumsum([1, abs(diff(test))]);
。对于test
输入,这给了我们:[1 2 4 7]
这似乎是正确的:-1
和-2
之间没有附加值,-2
和 [=39 之间有一个值=],最后是0
和3
. 之间的两个值
我们可以把这个向量作为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