创建忽略 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 是否为空以使其更可靠。