计算2D数组的每行中的非NaN值的数量

use*_*826 3 matlab nan

我有一个像这样的矩阵:

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]
Run Code Online (Sandbox Code Playgroud)

我想知道如何计算每行中除了任何NaNs 之外的值的数量.所以我会得到一个输出:

output = [5;
          7;
          10;]
Run Code Online (Sandbox Code Playgroud)

jub*_*0bs 7

如果A是2D阵列,例如

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]
Run Code Online (Sandbox Code Playgroud)

而且你想要计算NaN每一行的条目数A,你可以简单地使用

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

ans =
   5
   7
  10
Run Code Online (Sandbox Code Playgroud)

分解

  1. isnan(A)返回一个大小相同的逻辑数组A,其中(逻辑1表示a NaN0NaN.

    请注意,您必须isnan此处使用此功能.特别是,表达式A == ~NaN是无用的:它只返回一个大小相同A但完整(逻辑)的逻辑数组0.为什么?因为,根据浮点运算,NaN == NaN总是返回"false"(即0MATLAB中的逻辑).

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

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

生成的列向量正是您想要的:非NaN条目的计数,逐行计数A.