[英]Matlab Interpolating 1D Scattered Data
我有一些數據簡單地組織為2D(x,y)坐標。 我有大量的這些數據,而X軸的數據對於所有點都有相同的范圍,它不會在數據集之間使用相同的精確X點。 我想插入每組數據,然后為每個數據集獲取相同的X點。 每當我使用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和av(value)矩陣,這比我的維度更多。
我不知道如何繼續,建議和建議將不勝感激。
雖然你確實需要提供代碼的真實工作示例以及拋出錯誤的輸入數據的實際版本,但我將對此進行嘗試。 您發布的代碼和數據工作得很好:
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.
我很久以前寫過這篇文章,幾乎肯定不是最有效的方法,但它會奏效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.