【问题标题】:interp1 returns NaN for last value in x rangeinterp1 为 x 范围内的最后一个值返回 NaN
【发布时间】:2013-06-24 21:10:36
【问题描述】:

我对 MATLAB 中的 interp1 函数有疑问。让x 在 [1, 1024] 范围内。但是,以下内容:

yi = interp1(x, y, 1024);

返回NaN

我已经检查了我的程序几次,似乎没有任何问题,但结果对我来说仍然很奇怪。如果有人能提供帮助,我将不胜感激。

【问题讨论】:

  • 您能发布您的xy 向量吗?是否有重复的x 值?它们是单调递增的吗?
  • x 的值是“1024”,还是以较低的值结束? interp 不能在 x 的范围之外进行插值,除非选择了特定的方法。
  • @Dan 是的,x 是单调递增的。 x= 1.0e+003 *[0.0010 0.0030 0.0050 .. 1.0240] 顺便说一下,x 有 638 个元素。 y 不是单调的。我想得到的是 xi= 1,2,3,..,1024 的值 yi
  • x = 1.0e+003 * [0.0010 0.0030 0.0050] == [1 3 5].. 见 shai 的评论
  • @Adiel 是的,x 以 1024 结尾。

标签: matlab interpolation


【解决方案1】:

我很确定您没有达到 1024 而是一些值,但比 1023.9999999999945435 更小

试试这个非常人为的例子:

x = 1:10;
y = 1:10;
interp1(x, y, 10) %This works, returns 10

现在试试

x = 1:0.99999999768768765:10 %note x(end) will give you 10.0000, very deceptive because sum(x == 10 ) gives 0
interp(x, y, 10) %Returns NaN

因此,尽管我的示例非常做作,但有时可能会由于精度错误而发生,即使您指定的系列应该精确到 1024,但它不会因为截断以二进制表示漂亮的十进制数而他们没有长点好看。

如果这是您的问题,则将x 舍入到适当的精度,或者您可以在interp1 选项中指定外推,但我认为舍入更好,因为它会阻止其他意外的精度问题。

【讨论】:

    【解决方案2】:

    您必须验证值1024 存在于您的输入x 中。

    例如

    >> x = 1: 2 : 1024;
    

    似乎包含 1024,但它没有!

    >> x
    
       1 3 5 ... 1019 1021 1023
    

    没有 1024!

    如果要确保1024确实在x中,可以使用linspace

    >> x = linspace( 1, 1024, 512 ); % same number of elements as before, but now 1024 is included!
    

    【讨论】:

    • 或者,您可以指定外推 - yi = interp1(x,y,1024,method,'extrap');
    【解决方案3】:

    要查看 x 是否包含 1024(或更大),您可以使用: 任意(x>=1024)

    【讨论】:

      猜你喜欢
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多