【问题标题】:Modified linear interpolation with missing data缺失数据的修正线性插值
【发布时间】: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 值,并且对于大型 xx_i,执行速度很慢:

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

另一种选择是interp1q,它大约快两倍。

什么是允许我进行修改的快速方法?

可能的想法:

  1. Y_i1 进行后处理以消除NaN 值。
  2. 结合使用循环和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


【解决方案1】:

interp1 与样条插值一起使用 (spline) 会忽略 NaN。

【讨论】:

  • 使用spline 是个好主意,虽然感觉比线性插值要慢。插值后,我想根据x_i-value 应用不同的计算。是否有一种替代方法可以遍历所有元素并为每个元素设置一个 if 语句?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多