我想用最后一个非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
提前致谢
答案 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);