计算二维数组每行中非 NaN 值的数量

Count the number of non-NaN values in each row of a 2D array

我有一个这样的矩阵:

A = [1,  2,  3,  4,  5,  NaN,  NaN,  NaN,  NaN,  NaN;
     1,  2,  3,  4,  5,  6,    7,    NaN,  NaN,  NaN;
     1,  2,  3,  4,  5,  6,    7,    8,    9,    10]

我想知道如何计算每行中不包括任何 NaN 的值的数量。 所以我会得到如下输出:

output = [5;
          7;
          10;]

如果A是二维数组,例如

A = [1,  2,  3,  4,  5,  NaN,  NaN,  NaN,  NaN,  NaN;
     1,  2,  3,  4,  5,  6,    7,    NaN,  NaN,  NaN;
     1,  2,  3,  4,  5,  6,    7,    8,    9,    10]

并且您想计算 A 每行的 NaN 个条目的数量,您可以简单地使用

>> sum(~isnan(A), 2)

ans =
   5
   7
  10

细分

  1. isnan(A) returns 一个与A大小相同的逻辑数组,其中(logical1表示一个NaN0 一个非 NaN.

    请注意,您必须使用isnan功能,在这里。特别是,表达式 A == ~NaN 是无用的:它只是 return 一个与 A 大小相同但充满(逻辑)0 的逻辑数组。为什么?因为,根据浮点运算,NaN == NaN 总是 return 为“假”(即逻辑 0,在 MATLAB 中)。

  2. 然后,通过对其应用 MATLAB 的非运算符 (~),您将获得与 A 大小相同的逻辑数组,其中 1表示一个非NaN0一个NaN.

  3. 最后,sum(~isnan(A), 2)returns一个列向量,其中第i个条目对应第i个逻辑1的个数~isnan(A).

生成的列向量正是您想要的:A.

中非 NaN 条目的逐行计数