2013-05-29 71 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