在MATLAB中查找矩阵中的零元素数

1 matlab

我有一个NxM名为矩阵的例子A.在一些过程之后,我想要计算零元素.如何在一行代码中执行此操作?我试过A==0返回一个2D矩阵.

Nra*_*ras 25

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

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

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

基准测试的学分属于Divarkar.


标杆

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

输入尺寸

  • 小型数据 - 1:10:100
  • 中型数据量 - 50:50:1000
  • 大尺寸数据 - 500:500:4000

改变零的百分比

  • 大约10%的零案例 - A = round(rand(N)*5);
  • 约50%的零案例 - A = rand(N);A(A<=0.5)=0;
  • 约90%的零案例 - A = rand(N);A(A<=0.9)=0;

结果显示如下 -

1)小数据

在此输入图像描述

在此输入图像描述

在此输入图像描述

2. Medium Datasizes

在此输入图像描述

在此输入图像描述

在此输入图像描述

3.大型数据

在此输入图像描述

在此输入图像描述

在此输入图像描述

意见

  1. 如果你仔细观察到NNZ,并SUM于大中型datasizes性能曲线,你会发现自己的表现更接近对方10%90%零病例.对于50%零情况,方法SUMNNZ方法之间的性能差距相对较大.

  2. 作为对所有数据和所有三个零分数的一般观察, SUM方法似乎是无可争议的赢家.同样,在这里观察到一个有趣的事情,一般案例解决方案sum(A(:)==0)似乎在性能上比sum(~A(:)).

  • 这些解决方案中最有效的是`nnz(A == 0)` (2认同)

bla*_*bla 15

一些基本的matlab要知道:(:)运算符会将任何矩阵展平为列向量,~NOT运算符将零翻转为1而非零值为零,然后我们只使用sum:

sum(~A(:))
Run Code Online (Sandbox Code Playgroud)

如果效率很重要,这也应该比方案快10倍左右length(find....

编辑:在NaN值的情况下,您可以求助于解决方案:

sum(A(:)==0)
Run Code Online (Sandbox Code Playgroud)

  • @NematollahZarmehi然后使用`sum(A(:)== 0)`,同样的想法 (2认同)
  • 或者如果你真的坚持`~`,那么还有'nansum(~A(:))`...... (2认同)