【发布时间】:2012-08-17 15:59:29
【问题描述】:
想象一组具有给定 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-command 来始终使用邻居而不进行插值。
【问题讨论】:
-
您是否考虑过使用 k 个近邻插补来填补缺失的字段?有一个 matlab 函数 mathworks.com/help/toolbox/bioinfo/ref/knnimpute.html 但它在生物信息学工具箱中:/ 但它不是一个难以实现的算法。
-
据我了解 interp1 的输入不应包含 nans。试试
Y_i1 = interp1(x(~isnan(Y)), Y(~isnan(Y)), x_i);之类的东西,可能会更好。 -
@Dan:如果没有特殊的距离度量,您的总体思路是先完成数据,然后再进行进一步的线性插值。正确的?我认为,这是一个非常好的主意,因为我经常使用相同的基础数据进行插值。 @bdecaf:仅删除
NaNs 会在NaNs 之前的最后一个有效值和它们之后的第一个有效值之间产生奇怪的插值。因此,这确实会产生NaNs 之前的最后一个有效值,但两者兼而有之。
标签: matlab interpolation nan linear-interpolation