用最后一个非 NaN 值替换 NaN
Replace NaN with last non-NaN value
我有一个包含多个 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 类似 post 但所有解决方案似乎都涉及 for
循环。
这是一种矢量化方法 -
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;
如果您有 R2016b 或更高版本,请检查 fillmissing
函数。您可以使用 'previous'
方法来完成此操作。
我有一个包含多个 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 类似 post 但所有解决方案似乎都涉及 for
循环。
这是一种矢量化方法 -
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;
如果您有 R2016b 或更高版本,请检查 fillmissing
函数。您可以使用 'previous'
方法来完成此操作。