2014-12-03 59 views
1

我有一些簡單地組織爲二維(x,y)座標的數據。我有大量的這些數據,雖然X軸的數據對於所有點具有相同的範圍,但它不使用數據集之間相同的精確X點。我想插入每組數據,然後爲每個數據集獲取相同的X點。每當我使用Matlab嘗試插入數據時遇到問題。Matlab內插一維散亂數據

所以,我的數據是這樣的:

x = [0 1 2 3 4 5 6 7] 
y = [2.2 3.7 3.9 4.1 4.2 8.9 9.1 9.3] 
xq = [0.5 0.75 2 2.25] 

其中x和y是我記錄的數據值和XQ是我想從內插數據,以獲得新的x點。

通常我使用interp1命令這樣:

f = interp1(x,y,xq); 

不幸該命令產生錯誤:「網格向量不是嚴格單調遞增」如果我使用griddata或相關命令,會發生這種情況。我知道這是因爲我的數據不是來自函數,因此我需要一種處理分散數據的技術。所以我試圖使用scatterInterpolant,但似乎這個函數似乎不適合這種類型的數據,因爲它需要x,y和一個v(值)矩陣,它比我的尺寸更大。

我不知道如何繼續,建議和建議將不勝感激。

+3

我注意到你的'x'和'y'數組的大小不一樣。 – eigenchris 2014-12-03 18:57:27

+0

對不起,我組成了一些代表我的數據的數組,但沒有實際的副本,我編輯了數組以反映您的評論,並確保它們的大小相同。對於我的數據,我可以向你保證x和y的大小相同。 – DirectNirvana 2014-12-03 19:01:51

+0

也許'resample'可以提供幫助。 – Rashid 2014-12-03 19:04:35

回答

3

雖然您確實需要提供一個真實的代碼示例和引發錯誤的輸入數據的實際版本,但我會對此做一個嘗試。代碼和數據,你投遞工作就好了:

f = 

     2.95  3.325   3.9   3.95 

你得到的錯誤意味着實際x向量不排序,因爲它是在你的例子這裏,否則它包含重複的值(即x = [0 1 1 2 3];) 。您可以使用issorted(x)命令測試第一種情況,使用any(diff(x) == 0)測試第二種情況。

第一種情況很容易解決:

[x,ix] = sort(x); 
y = y(ix); 
xq = sort(xq); 
yq = interp1(x,y,xq); 

有幾個方法來處理第二種情況,根據您的應用程序。您可以搜索重複項並將它們移動±eps,將它們平均或丟棄。

雖然沒有重複您的錯誤的數據,但我們都只是猜測。

更新:

看您發佈的數據(和對子孫後代的緣故,你應該直接編輯成你的問題),你有兩個問題。您的數據沒有排序,並有重複。正如我所說,排序很簡單。 排序如上之後,這是我在過去所做的那樣採取重複的條目的護理:

xu = unique(x); 
yu = y; 
duplicated = xu(histc(x,xu) > 1); % find the duplicated entries 
discardIndex = []; 
for k = 1:length(duplicated); 
    dupIndex = sort(find(x == duplicated(k))); % look for duplicated entries 
    keepIndex = dupIndex(1); % keep only the first one 
    discardIndex = [discardIndex dupIndex(2:end)]; % add the rest to a list 
    yu(keepIndex) = mean(y(:,dupIndex)); % take the mean of the y values at the duplicated x values 
end 
yu(discardIndex) = []; % after all is said and done, delete the duplicated entries. 

我寫了很長一段時間以前,幾乎可以肯定是不這樣做的最有效方法,但它會起作用。

+0

上述我的意見的重複:X數據的樣品可在:notepad.cc/share/Xyw7MlZ04H和Y數據的示例可在notepad.cc/share/bdbHaRS74F我使用了這個小樣本的數據,並能夠重現上面描述的錯誤。 – DirectNirvana 2014-12-03 20:00:51

+1

我注意到你的x值有重複。正如Craigim所說,你需要找到解決這些問題的方法。你有沒有關心這個問題? – eigenchris 2014-12-03 20:02:27

+0

謝謝@craigim和eigenchris,你的建議工作得很好,我試着先排序,使用與craigim建議的相同的代碼,但是我的腳本仍然有相同的錯誤。由於有一些重複項,我在matlab中使用'code'unique命令刪除了它們,我使用的代碼是:'[x,ia,ic] = unique(x);' 'y = y(ia);' 'yq = interp1(x,y,xq);' 'plot(xq,yq);' – DirectNirvana 2014-12-03 22:13:45