arrays - 如何用下一个最接近的数字替换数组中的 NaN?

标签 arrays performance matlab nan

让我更详细地描述我的问题。我将实验中的大量数据记录到两个数组中:counttick。然后使用这两个数组来计算 factor,如下所示:

factor = (diff(tick)./diff(count))

由于这是原始数据,因此不能保证产生“漂亮”的数字。事实上,我得到的是一个类似于 factor = [2, 3, 4, 5, 6, NaN, NaN, NaN, 3, 3, 4, 5, NaN, ... ].

我需要使用无法处理 NaN 的函数进一步操作这些数据。我想做的是在 factor 中搜索 NaN 并将其替换为下一个最接近的数字。

在数组中搜索 NaN 值并替换它们不是问题。例如,我所要做的就是 a(isnan(a)) = some value。但是,为了保持数据一致,我想将每个 个别 NaN 替换为最接近的不是 NaN 的值。

我最初的想法是遍历数组,寻找 NaN,然后​​进入另一个 for 循环,直到找到一个有效数字,然后用这个数字替换 NaN。

这很可能会奏效,但我担心的是效率。我的数组可以是兆字节。有没有更好的方法来完成我需要的?

欢迎任何建设性的意见。

最佳答案

方法一:使用bsxfun+abs+min

代码

%// Input
factor = [2, 3, 4, 5, 6, NaN, NaN, NaN, 3, 3, 4, 5, NaN, 6]

%// Indices of NaNs
t1 = find(isnan(factor)); 

%// Indices of non-NaNs
t2 = find(~isnan(factor));

%// Get index for each NaN index that is closest, with a tie-case 
%// (closest non-NaN number being at equal distance on either side) 
%// selecting the left one
[~,ind1] = min(abs(bsxfun(@minus,t1,t2'))); %//'

%// Replace NaNs with the closest non-NaNs
factor(t1) = factor(t2(ind1))

输出(代码运行时)

factor =
     2     3     4     5     6   NaN   NaN   NaN     3     3     4     5   NaN     6
factor =
     2     3     4     5     6     6     6     3     3     3     4     5     5     6

方法 2:使用带有“最近”选项的一维插值

代码

%// Input
factor = [2, 3, 4, 5, 6, NaN, NaN, NaN, 3, 3, 4, 5, NaN, 6]

%// Index array for factor
x = 1:numel(factor);

%// Indices of NaNs
t2 = find(~isnan(factor)); 

%// Replace NaNs with the closest non-NaNs
factor = interp1(x(t2),factor(t2),x,'nearest')

输出(代码运行时)

factor =
     2     3     4     5     6   NaN   NaN   NaN     3     3     4     5   NaN     6
factor =
     2     3     4     5     6     6     3     3     3     3     4     5     6     6

请注意,在出现平局的情况下(如前所述),它会选择右边的而不是前面方法中的左边。另请注意,此方法仅在 factor 的第一个和最后一个元素不是 NaN 时才有效。

最后,建议尽量避免变量名与内置 MATLAB 函数名相同。在这种情况下,factor 就是这样一个名称。

关于arrays - 如何用下一个最接近的数字替换数组中的 NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374171/

相关文章:

javascript - Json - 具有重复数据的完整记录,或标准化

java - Android Studio 核心转储

c++ - 如何根据参数的大小在函数内声明一个数组?

arrays - 单击时显示相关对象(选定的 id)的 knockout js

mysql - 优化慢速 SELECT 查询

linux - 打开 "An error was encountered while saving the command history"Matlab报错

mysql - 从 Matlab 运行存储过程仅返回 1 行

image - 为什么使用相同的 MATLAB 代码会得到不同颜色的图像?

python - 如何获取多维numpy数组中最大n个值的索引

Javascript foreach 不适用于所有对象