【问题标题】:Using interp1 for non-uniform query points对非统一查询点使用 interp1
【发布时间】:2015-06-23 22:18:07
【问题描述】:

我想使用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 的示例,但我仍然无法找到答案。对于这个简单的查询,我将不胜感激。

【问题讨论】:

  • 这不就是min(test):max(test)吗?
  • @LuisMendo 天哪,你当然是对的。看看我对此的复杂答案:(当然这仅适用于线性插值,而interp1 解决方案可以使用任何插值方法,例如三次
  • @hbaderts 目前还不清楚 OP 想要什么。也许他们应该澄清

标签: matlab interpolation


【解决方案1】:

interp1 的一般语法是

vq = interp1(x,v,xq);

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

vq = interp1(v,xq);

其中x 假定为1: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 之间没有附加值,-20 之间有一个值,最后是 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 函数的一个非常好的概述。通过这个答案解决了我在实施中遇到的几个问题,包括我提供的示例。感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 2014-01-02
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多