统计一个二维数组每行非NaN值的数量

4

I have a matrix like this:

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;]
1个回答

9
如果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)会返回一个与A大小相同的逻辑数组,其中逻辑1表示为NaN,逻辑0表示为非NaN

    请注意这里必须使用isnan函数。特别是表达式A == ~NaN是无用的:它只会返回与A大小相同且充满(逻辑)0's的逻辑数组。为什么呢?因为根据浮点运算,NaN == NaN总是返回“false”(即在MATLAB中为逻辑0)。

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

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

得到的列向量正是你所需要的:逐行计算A中非NaN条目的数量。


sum(A<=inf,2) 也可以工作,因为 NaN<=inf 是 false。注意这样做没有使用 isnan 函数,但并不更清晰。 - Joe Serrano
@JoeSerrano 真的没错!那样做可以行得通。但是,isnan更加清晰易懂。 - jub0bs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接