Matlab 用最后一个非NaN值替换NaN

Matlab 用最后一个非NaN值替换NaN,matlab,replace,nan,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值,我想用最后一个非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]

我想知道是否有人遇到过类似的问题,并且知道一种有效的解决方法。我读过类似的文章,但所有的解决方案似乎都涉及到一个
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;

这里有一种矢量化方法-

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或更高版本,请查看该功能。您可以使用
'previous'
方法来精确执行此操作。

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

为什么只替换一些
NaN
s而不替换其他?这是每列的吗?每排?还有别的吗?对不起。那是个打字错误。我已经改正了。这是每列。我怀疑这是可能的,我不认为NAN可能是由矢量化函数处理的。NAN可以被任意数字替换,如-99I。我仍然不理解所需输出的第1列和第2列。为什么只替换一些
NAN
s,而不替换其他?这是每列的吗?每排?还有别的吗?对不起。那是个打字错误。我已经改正了。这是每列。我怀疑这是可能的,我不认为NAN可能是由矢量化函数处理的。NAN可以被任意数字替换,如-99I。我仍然不理解您所需输出的第1列和第2列。令人印象深刻!谢谢给人印象深刻的谢谢