想象一下具有給定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的值和執行對於大型x
和x_i
慢:
starttime = cputime;
Y_i1 = interp1(x, Y, x_i);
executiontime1 = cputime - starttime
另一種方法是interp1q
,這大約要快兩倍。
什麼是允許我修改的非常快速的方式?
可能的想法:的Y_i1
- 待辦事項後處理,以消除
NaN
- 值。 - 使用循環和
find
命令的組合來始終使用沒有內插的鄰居。
你有沒有想過使用k nearset neighbors填補填補我缺少的領域?它有一個matlab函數http://www.mathworks.com/help/toolbox/bioinfo/ref/knnimpute.html,但它在生物信息學工具箱中:/但它並不是一個如此難以實現的算法。 – Dan
從我所瞭解的interp1的輸入不應該包含nans。嘗試像'Y_i1 = interp1(x(〜isnan(Y)),Y(〜isnan(Y)),x_i);'可能更好的linewise。 – bdecaf
@丹:沒有特殊的距離測量,您的一般想法是在進行進一步的線性插值之前完成數據。對?我認爲,這是一個非常好的想法,因爲我經常用相同的底層數據進行插值。 @bdecaf:只要將'NaN's屈服於'NaN'前面的最後一個有效值和它們之後的第一個有效值之間奇怪的插值。因此,這確實產生了'NaN'之前的最後一個有效值,但是兩者都是混合的。 – Lukas