如果我有一个像这样的 1 或 NaN 的向量:
[1 1 1 NaN 1 1 NaN 1 1 1 1]
如何在 NaN 的位置将 cumsum 重置为零,如下所示:
[1 2 3 0 1 2 0 1 2 3 4]
理想情况下,我希望有一个矢量化解决方案,因为我需要对大矩阵中的每一列都执行此操作,并且 NaN 的位置在列中不是恒定的。
提前致谢。
如果我有一个像这样的 1 或 NaN 的向量:
[1 1 1 NaN 1 1 NaN 1 1 1 1]
如何在 NaN 的位置将 cumsum 重置为零,如下所示:
[1 2 3 0 1 2 0 1 2 3 4]
理想情况下,我希望有一个矢量化解决方案,因为我需要对大矩阵中的每一列都执行此操作,并且 NaN 的位置在列中不是恒定的。
提前致谢。
您可以尝试以下两条“矢量化”行:
A(isnan(A)) = 1-diff([0 find(isnan(A))]);
cumsum(A)
ans =
1 2 3 0 1 2 0 1 2 3 4
诀窍是NaN
用一个将在这些点重置的值cumsum
替换0
。
我只能想到几个解决方案:
v = [1 1 1 NaN 1 1 1 1 NaN 1];
a = v==v; %% convert the values first to [1 1 1 0 1 1 1 1 0 1] format
n = a==0; %% positions of the NaNs
c = cumsum(a); %% your intermediate result
d = diff([0 c(n)]); %% runs of ones
v(n) = -d; %% replace Nans by -3, -4 [1 1 1 -3 1 1 1 1 -4 1]
cumsum(v) %% the answer [1 2 3 0 1 2 3 4 0 1]
注意:尚未检查极端条件(NaN
在第一个/最后一个位置,连续NaN
s 等)
在这个链接中有一个很好的 FEX 文件可以处理这个问题。该代码对 NaN 进行了用户指定的处理。它允许用户用零替换 NaN,或者跳过它们,或者重置 NaN,将 NaN 保持为占位符。