加速用最后的非Nan值替换NaNs

时间:2013-06-21 16:36:07

标签: matlab optimization for-loop

我想用最后一个非NaN值替换向量中的所有NaN

input =  [1 2 3 NaN NaN 2];
output = [1 2 3 3   3   2];

我想尝试加速我已经拥有的循环

input = [1 2 3 NaN NaN 2];

if isnan(input(1))
    input(1) = 0;
end

for i= 2:numel(input)
    if isnan(input(i))
        input(i) = input(i-1);
    end
end

提前致谢

4 个答案:

答案 0 :(得分:2)

由于您需要先前的非NaN值,我将假设第一个值必须是数字。

while(any(isnan(input)))
    input(isnan(input)) = input(find(isnan(input))-1);
end

我描述了迪伦的解决方案,奥列格的解决方案,以及我的4770万长矢量。迪伦的时间为12.3秒,奥列格的时间为3.7,而我的时间为1.9。

答案 1 :(得分:0)

这里有一个注释解决方案,仅适用于矢量,但可能会扩展为处理矩阵:

A = [NaN NaN 1 2 3 NaN NaN 2 NaN NaN NaN 3 NaN 5 NaN NaN];

% start/end positions of NaN sequences
sten = diff([0 isnan(A) 0]);
B    = [NaN A];
% replace with previous non NaN
B(sten == -1) = B(sten == 1);
% Trim first value (previously padded)
B = B(2:end);

比较

A: NaN NaN 1 2 3 NaN NaN 2 NaN NaN NaN 3 NaN 5 NaN NaN
B: NaN NaN 1 2 3 NaN   3 2 NaN NaN   2 3   3 5 NaN   5

答案 2 :(得分:0)

没有完全矢量化但非常简单,可能仍然相当有效:

x = [1 2 3 NaN NaN 2];
for f = find(isnan(x))
    x(f)=x(f-1);
end

当然这与@Hugh Nolan提供的解决方案略有不同

答案 3 :(得分:-1)

nan_ind = find(isnan(A)==1);
A(nan_ind) = A(nan_ind-1);