如果我有一个1或NaN的向量,如下所示:
[1 1 1 NaN 1 1 NaN 1 1 1 1]
Run Code Online (Sandbox Code Playgroud)
如何在以下NaN的位置将cumsum重置为零:
[1 2 3 0 1 2 0 1 2 3 4]
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要一个矢量化解决方案,因为我需要对大矩阵中的每一列执行此操作,并且NaN的位置在列之间不是恒定的.
提前致谢.
ang*_*nor 12
您可以尝试以下两个"矢量化"行:
A(isnan(A)) = 1-diff([0 find(isnan(A))]);
cumsum(A)
ans =
1 2 3 0 1 2 0 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
诀窍是替换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]
Run Code Online (Sandbox Code Playgroud)
注意:没有检查极端条件(NaN在第一个/最后一个位置,连续NaNs等)
| 归档时间: |
|
| 查看次数: |
1528 次 |
| 最近记录: |