2013-05-29 69 views
5

我有一堆2D中的点,我知道这个值,我想通过它们拟合一个三次样条来插入一些使用MATLAB的其他数据。为什么feval会在MATLAB中返回NaN

我的代码如下所示:

fitobject = fit(x,y,'cubicinterp'); 
yy=feval(fitobject,xx) 

与以下输入:

坐标

x = [... 
    313  3; 
    313  5; 
    313  7; 
    315  3; 
    315  5; 
    317  3; 
    319  5]; 

y = [... 
    28.0779; 
    28.0186; 
    11.6220; 
    16.7640; 
    23.7139; 
    -14.7882; 
    -20.4626]; 

插补点

xx = [... 
    313  3; 
    313  4; 
    313  5; 
    313  6; 
    313  7; 
    313  8; 
    313  9; 
    314  3; 
    314  5; 
    314  7; 
    315  3; 
    315  4; 
    315  5; 
    315  6; 
    315  7; 
    316  3; 
    316  5; 
    317  3; 
    317  4; 
    317  5; 
    318  3; 
    319  5; 
    319  6; 
    319  7; 
    320  5]; 

在我的输出矢量yy中,我得到了几个NaN值。对我来说,输入数据看起来很干净(它们都是有限值,并且没有NaN)。我不明白什么会导致feval在拟合数据时返回NaN。为什么它不能提供最好的配合,即使它不好?我的方法有错误吗?

我浏览了一下,看起来同样的问题在mathworks论坛上被问了很多次,但没有人给出明确的答案。

在此先感谢您的帮助。

+0

我没有曲线拟合工具箱。你有办法检查拟合函数吗?也许一些你用来评估拟合函数的数据点会导致['NaN'](http://www.mathworks.com/help/matlab/ref/nan.html) – Schorsch

+0

你可以使用' yy = fitobject(xx)'语法太 –

回答

7

这是因为不能用作推断

%xx(:,1) xx(:,2) yy 

    313.0000 3.0000 28.0779 
    313.0000 4.0000 29.5074 
    313.0000 5.0000 28.0186 
    313.0000 6.0000 22.3233 
    313.0000 7.0000 11.6220 
    313.0000 8.0000  NaN % xx exceeds bounds of original x interval 
    313.0000 9.0000  NaN % xx exceeds bounds of original x interval 
    314.0000 3.0000 24.1239 
    314.0000 5.0000 27.5130 
    314.0000 7.0000  NaN % xx exceeds bounds of original x interval 
    315.0000 3.0000 16.7640 
    315.0000 4.0000 21.7028 
    315.0000 5.0000 23.7139 
    315.0000 6.0000 11.2710 
    315.0000 7.0000  NaN % xx exceeds bounds of original x interval 
    316.0000 3.0000 1.4641 
    316.0000 5.0000 13.9662 
    317.0000 3.0000 -14.7882 
    317.0000 4.0000 -5.4876 
    317.0000 5.0000 2.7781 
    318.0000 3.0000  NaN % xx exceeds bounds of original x interval 
    319.0000 5.0000 -20.4626 
    319.0000 6.0000  NaN % xx exceeds bounds of original x interval 
    319.0000 7.0000  NaN % xx exceeds bounds of original x interval 
    320.0000 5.0000  NaN % xx exceeds bounds of original x interval 

换句话说,你想超越你原来的表面数据(外推),边界数据,通常已经很危险了,fit甚至不允许你这样做。

+0

完美,谢谢。我认为“合适”是使用我给出的一堆点作为输入来返回一个无处不在的函数。 – Virginie

+0

@Virginie:如果你愿意,你可以改成'nearestinterp'来复制边界上的数值*,或者使用'biharmonicinterp'来继续在边界之外。请注意,在这种情况下,您的值将完全爆炸;一个基本的副作用,使用一个准确*插值*外推* :) –

+0

现在,我明白发生了什么事情,我认为只关心插值间隔内的值更有意义。无论如何感谢诀窍! – Virginie

6

它看起来像NaN出现在插值之外的点。你可以绘制它来看看。

cubic interpolation

我用这是如下播放的代码:(请注意,我设置的NaN至-25只是让他们可以绘制)

x = [313  3; 
    313  5; 
    313  7; 
    315  3; 
    315  5; 
    317  3; 
    319  5]; 
y = [ 
    28.0779 
    28.0186 
    11.6220 
    16.7640 
    23.7139 
    -14.7882 
    -20.4626]; 

fitobject = fit(x,y,'cubicinterp'); 

xx = [ 
    313  3 
    313  4 
    313  5 
    313  6 
    313  7 
    313  8 
    313  9 
    314  3 
    314  5 
    314  7 
    315  3 
    315  4 
    315  5 
    315  6 
    315  7 
    316  3 
    316  5 
    317  3 
    317  4 
    317  5 
    318  3 
    319  5 
    319  6 
    319  7 
    320  5]; 


yy = fitobject(xx); 
badindices = isnan(yy); 
yy(badindices) = -25; 

plot(fitobject, xx, yy, 'Exclude', badindices) 

顺便说一句,注意我没有使用feval,但是直接调用fitobject

+2

+ 1:总是一个+1的好回答伴随着情节:) –

+0

情节正是我想看到的。我不知道我也可以直接调用fitobject。非常有帮助的答案,谢谢! – Virginie