2012-08-22 72 views
0

想象一下具有給定x值(作爲列向量)和幾個組合在矩陣(列向量的行向量)中的y值的數據集。矩陣中的某些值不可用:帶有缺失數據的修改線性插值

%% Create the test data 
N = 1e2; % Number of x-values 

x = 2*sort(rand(N, 1))-1; 
Y = [x.^2, x.^3, x.^4, x.^5, x.^6]; % Example values 
Y(50:80, 4) = NaN(31, 1); % Some values are not avaiable 

現在我有一個用於插值的新x值列向量。

K = 1e2; % Number of interplolation values 
x_i = rand(K, 1); 

我的目標是找到一種快速方法來插入給定x_i值的所有y值。如果y值中有NaN值,我想使用丟失數據之前的y值。在示例中,這將是Y(49, :)中的數據。

如果我使用interp1,我得到NaN的值和執行對於大型xx_i慢:

starttime = cputime; 
Y_i1 = interp1(x, Y, x_i); 
executiontime1 = cputime - starttime 

另一種方法是interp1q,這大約要快兩倍。

什麼是允許我修改的非常快速的方式?

可能的想法:的Y_i1

  1. 待辦事項後處理,以消除NaN - 值。
  2. 使用循環和find命令的組合來始終使用沒有內插的鄰居。
+0

你有沒有想過使用k nearset neighbors填補填補我缺少的領域?它有一個matlab函數http://www.mathworks.com/help/toolbox/bioinfo/ref/knnimpute.html,但它在生物信息學工具箱中:/但它並不是一個如此難以實現的算法。 – Dan

+0

從我所瞭解的interp1的輸入不應該包含nans。嘗試像'Y_i1 = interp1(x(〜isnan(Y)),Y(〜isnan(Y)),x_i);'可能更好的linewise。 – bdecaf

+0

@丹:沒有特殊的距離測量,您的一般想法是在進行進一步的線性插值之前完成數據。對?我認爲,這是一個非常好的想法,因爲我經常用相同的底層數據進行插值。 @bdecaf:只要將'NaN's屈服於'NaN'前面的最後一個有效值和它們之後的第一個有效值之間奇怪的插值。因此,這確實產生了'NaN'之前的最後一個有效值,但是兩者都是混合的。 – Lukas

回答

1

使用帶樣條插值(spline)的interp1會忽略NaN。

+0

使用'樣條線'是一個好主意,雖然感覺比線性插值要慢。 插值後,我想根據'x_i'值應用不同的計算。是否有替代方法循環遍歷所有元素,併爲每個元素都有if語句? – Lukas