创建忽略 NaN 条目的新数组
Creating a new array that ignores NaN entries
我有以下数组,其中包含一些 NaN
条目的序列:
A = [..., 14, 19, 32, 41, NaN, NaN, NaN, 4, NaN, 51, 62, 74, 58, ...]
在一个循环中,我想遍历数组,当我找到第一个 NaN
时,我想构造另一个数组 B
,我在其中使用前面的 4 个值和前 4 个值我找到的第一个 NaN
之后出现的非 NaN
值。所以我的 B
应该是这样的:
B = [14, 19, 32, 41, 4, 51, 62, 74, 58]
显然我不能使用 B = A(~isnan(A))
因为这只会创建一个 A 但没有我不想要的 NaN
。
有什么好的方法吗?
可以用find
得到第一个NaN
,用这个分别从前后的非NaN元素中得到最后或前4个元素:
A = [1, 2, 3, 14, 19, 32, 41, NaN, NaN, NaN, 4, NaN, 51, 62, 74, 58, 4, 5, 6];
idxNaN = find( isnan(A), 1 );
idxOK = ~isnan(A);
B = A( [ find(idxOK(1:idxNaN-1), 4, 'last'), idxNaN+find(idxOK(idxNaN+1:end), 4) ] );
B =
14 19 32 41 4 51 62 74
这里的一件好事是 find
只会 return 最多 4 个元素(或者您要求的任何数量),所以您不会如果 before/after NaN
可用的较少,则会出现错误。此代码确实假定至少有一个 NaN
- 您可以检查 idxNaN
是否为空以使其更可靠。
我有以下数组,其中包含一些 NaN
条目的序列:
A = [..., 14, 19, 32, 41, NaN, NaN, NaN, 4, NaN, 51, 62, 74, 58, ...]
在一个循环中,我想遍历数组,当我找到第一个 NaN
时,我想构造另一个数组 B
,我在其中使用前面的 4 个值和前 4 个值我找到的第一个 NaN
之后出现的非 NaN
值。所以我的 B
应该是这样的:
B = [14, 19, 32, 41, 4, 51, 62, 74, 58]
显然我不能使用 B = A(~isnan(A))
因为这只会创建一个 A 但没有我不想要的 NaN
。
有什么好的方法吗?
可以用find
得到第一个NaN
,用这个分别从前后的非NaN元素中得到最后或前4个元素:
A = [1, 2, 3, 14, 19, 32, 41, NaN, NaN, NaN, 4, NaN, 51, 62, 74, 58, 4, 5, 6];
idxNaN = find( isnan(A), 1 );
idxOK = ~isnan(A);
B = A( [ find(idxOK(1:idxNaN-1), 4, 'last'), idxNaN+find(idxOK(idxNaN+1:end), 4) ] );
B =
14 19 32 41 4 51 62 74
这里的一件好事是 find
只会 return 最多 4 个元素(或者您要求的任何数量),所以您不会如果 before/after NaN
可用的较少,则会出现错误。此代码确实假定至少有一个 NaN
- 您可以检查 idxNaN
是否为空以使其更可靠。