方法1:使用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:使用1-d插补 '最近' 选项
代码
%// 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
的第一个和最后一个元素不是NaNs
时,此方法才有效。
最后,试图避免变量名称与内置MATLAB函数名称相同。在这种情况下,factor
就是这样一个名字。
什么是*最有意义的*号码替代?通常它是零。 –
然而,这是真的,但是,这些数据应该是对数曲线 - 这只是计算的一个方面,不应该等于零(这个因子是标量)。我有同样的想法,但我意识到我需要尝试接近周围的有效值。 – Mlagma
如果结果是NaN,那么您已经被告知结果不能用浮点数表示。因此任何近似都是错误的。 –