【问题标题】:Replace NaN with last non-NaN value用最后一个非 NaN 值替换 NaN
【发布时间】:2017-08-14 12:29:49
【问题描述】:

我有一个包含多个 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 循环。

【问题讨论】:

  • 为什么你只替换一些NaNs 而不是其他的?这是每列吗?每行?根据别的什么?
  • 对不起。这是一个错字。我已经纠正了。它是每列。
  • 我怀疑这是可能的,我不认为 N​​AN 可能是由矢量化函数处理的 stackoverflow.com/questions/15560567/…
  • NaN 可以替换为任意数字,例如 -99
  • 我仍然不理解您所需输出的第 1 列和第 2 列。

标签: matlab replace nan


【解决方案1】:

这是一种矢量化方法 -

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;

【讨论】:

  • 令人印象深刻!谢谢!
【解决方案2】:

如果您有 R2016b 或更高版本,请查看 fillmissing 函数。您可以使用'previous' 方法来做到这一点。

【讨论】:

    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 2017-08-25
    • 2012-06-13
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多