将NaN替换为最后一个非NaN值

时间:2017-03-22 11:52:13

标签: matlab replace nan

我有一个包含几个NaN值的矩阵,我想用最后一个非NaN值替换那些。矩阵非常大,所以理想情况下我会以矢量化方式进行。

这是一个最小的工作示例:

M = [
NaN NaN NaN 3
7   NaN NaN 1
NaN NaN NaN 9
NaN 6   NaN NaN
NaN NaN NaN NaN
8   NaN NaN 8
NaN 5   NaN NaN
NaN NaN NaN NaN
9   NaN NaN NaN]

输出应为:

Out = [
NaN NaN NaN 3
7   NaN NaN 1
7   NaN NaN 9
7   6   NaN 9
7   6   NaN 9
8   6   NaN 8
8   5   NaN 8
8   5   NaN 8
9   5   NaN 8]

我想知道是否有人遇到类似的问题,并且知道解决问题的有效方法。我已阅读this类似的帖子,但所有解决方案似乎都涉及for循环。

2 个答案:

答案 0 :(得分:6)

这是一种矢量化方法 -

mask = ~isnan(M);
cumsums = cumsum(mask,1);
invalid_mask = cumsums==0;
cumsums(invalid_mask) = 1;

shifts = [0 cumsum(sum(mask(:,1:end-1),1))];

idx = bsxfun(@plus,cumsums, shifts);
nums = M(mask);
out = nums(idx);
out(invalid_mask)=nan;

答案 1 :(得分:3)

如果您有R2016b或更高版本,请查看fillmissing功能。您可以使用'previous'方法完成此操作。