方法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,那麼您已經被告知結果不能用浮點數表示。因此任何近似都是錯誤的。 –