在MATLAB中求矩阵中的零元素个数

在MATLAB中求矩阵中的零元素个数,matlab,Matlab,我有一个NxM矩阵,例如名为a。经过一些过程后,我想计算零元素。 如何在一行代码中完成此操作?我尝试了返回2D矩阵的A==0。一些基本的matlab知识:(:)操作符将任何矩阵展平为列向量,~是NOT操作符将零翻转为一,将非零值翻转为零,然后我们只使用sum: sum(~A(:)) 这也应该比长度快10倍(查找…方案,以防效率很重要) 编辑:对于NaN值,您可以采用以下解决方案: sum(A(:)==0) 一些基本的matlab知识:(:)运算符将任何矩阵展平为列向量,~是非运算符将零翻转为

我有一个
NxM
矩阵,例如名为
a
。经过一些过程后,我想计算零元素。
如何在一行代码中完成此操作?我尝试了返回2D矩阵的
A==0

一些基本的matlab知识:
(:)
操作符将任何矩阵展平为列向量,
~
是NOT操作符将零翻转为一,将非零值翻转为零,然后我们只使用sum:

sum(~A(:))
这也应该比
长度快10倍(查找…
方案,以防效率很重要)

编辑:对于NaN值,您可以采用以下解决方案:

sum(A(:)==0)

一些基本的matlab知识:
(:)
运算符将任何矩阵展平为列向量,
~
是非运算符将零翻转为一,将非零值翻转为零,然后我们只使用求和:

sum(~A(:))
这也应该比
长度快10倍(查找…
方案,以防效率很重要)

编辑:对于NaN值,您可以采用以下解决方案:

sum(A(:)==0)

我还将在混合中添加一些内容。您可以使用并计算整个矩阵的直方图。您可以指定第二个参数作为收集数字的位置。如果我们只想计算零的数量,我们可以简单地指定
0
作为第二个参数。但是,如果您在
his中指定一个矩阵tc
,它将沿列操作,但我们希望对整个矩阵进行操作。因此,只需将矩阵转换为列向量
a(:)
,然后使用
histc
。换句话说,执行以下操作:

histc(A(:), 0)

这应该相当于计算整个矩阵中的零的数量。我也会在混合中添加一些内容。您可以使用并计算整个矩阵的直方图。您可以指定第二个参数,作为收集数字的位置。如果我们只想计算零的数量,可以使用s暗示指定
0
作为第二个参数。但是,如果将矩阵指定为
histc
,它将沿列操作,但我们希望对整个矩阵进行操作。因此,只需将矩阵转换为列向量
a(:)
,然后使用
histc
。换句话说,执行以下操作:

histc(A(:), 0)

这应该相当于计算整个矩阵中的零数
A

有一个函数可以查找非零矩阵元素的数量
nnz
。您可以在逻辑矩阵上使用此函数,该函数将返回
true
的数量

在这种情况下,我们对矩阵
A==0
应用
nnz
,因此逻辑矩阵的元素为
true
,如果原始元素为0,则对除0以外的任何其他元素应用
false

A = [1, 3, 1;
     0, 0, 2;
     0, 2, 1];
nnz(A==0)  %// returns 3, i.e. the number of zeros of A (the amount of true in A==0)
基准测试的学分属于Divarkar


标杆管理 使用以下参数和输入,可以使用
timeit
对此处提供的解决方案进行基准测试

输入大小

  • 小型数据大小-
    1:10:100
  • 中等大小的数据大小-
    50:50:1000
  • 大数据量-
    500:500:4000
改变零的百分比

  • 约10%零的情况下-
    A=四舍五入(兰特(N)*5);

  • 约50%的零大小写-
    A=rand(N);A(A有一个函数,用于查找非零矩阵元素的数量
    nnz
    。您可以在逻辑矩阵上使用此函数,该函数将返回
    true
    的数量

    在这种情况下,我们对矩阵
    A==0
    应用
    nnz
    ,因此逻辑矩阵的元素为
    true
    ,如果原始元素为0,则对除0以外的任何其他元素应用
    false

    A = [1, 3, 1;
         0, 0, 2;
         0, 2, 1];
    nnz(A==0)  %// returns 3, i.e. the number of zeros of A (the amount of true in A==0)
    
    基准测试的学分属于Divarkar


    标杆管理 使用以下参数和输入,可以使用
    timeit
    对此处提供的解决方案进行基准测试

    输入大小

    • 小型数据大小-
      1:10:100
    • 中等大小的数据大小-
      50:50:1000
    • 大数据量-
      500:500:4000
    改变零的百分比

    • 约10%零的情况下-
      A=四舍五入(兰特(N)*5);

    • 约50%的零情况-
      A=rand(N);A(A我不知道我是否回答得很好,但你可以将其编码如下:

          % Random Matrix
      M = [1 0 4 8 0 6;
           0 0 7 4 8 0;
           8 7 4 0 6 0];
      
      n = size(M,1); % Number of lines of M
      p = size(M,2); % Number of columns of M
      
      nbrOfZeros = 0; % counter
      
      for i=1:n
          for j=1:p
              if M(i,j) == 0
                  nbrOfZeros = nbrOfZeros + 1;
              end
          end
      end
      
      nbrOfZeros
      

      我不知道我是否能很好地回答这个问题,但你可以将其编码如下:

          % Random Matrix
      M = [1 0 4 8 0 6;
           0 0 7 4 8 0;
           8 7 4 0 6 0];
      
      n = size(M,1); % Number of lines of M
      p = size(M,2); % Number of columns of M
      
      nbrOfZeros = 0; % counter
      
      for i=1:n
          for j=1:p
              if M(i,j) == 0
                  nbrOfZeros = nbrOfZeros + 1;
              end
          end
      end
      
      nbrOfZeros
      

      @rayryeng如果矩阵有一个
      NaN
      元素,你不能使用
      sum(~a(:)
      ,因为
      NaN
      不能转换为逻辑。@Nemallahzarmehi然后使用
      sum(a(:)==0)
      ,同样的思想,我首先写了
      sum(a(:)==0)
      并将其编辑为
      ~A
      选项……或者如果你真的坚持
      ~
      ,还有
      nansum(~A(:)
      )。@Dev iL-当然可以,但我只是本着一句话的精神回答:)
      nansum
      如果你自己实现它,那不是一行:(.不过,这是一个很好的解决办法。@rayryeng如果矩阵有一个
      NaN
      元素,你就不能使用
      sum(~a(:)
      ),因为
      NaN
      不能转换为逻辑。@Nemallahzarmehi然后使用
      sum(a(:)==0)
      ,同样的思想,我第一次写了
      sum(a(:)==0)
      并将其编辑为
      ~A
      选项……或者如果你真的坚持
      ~
      ,还有
      nansum(~A(:)
      )。@Dev iL-当然可以,但我只是本着一句话的精神回答:)
      nansum
      如果你自己实现它,那不是一行:(.不过,这是一个很好的解决方法。这与问题要求的相反,即零元素的数量而不是非零元素。您需要执行
      numel(a)-nnz(a)
      或其他操作