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

时间:2014-08-15 04:39:01

标签: matlab

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

4 个答案:

答案 0 :(得分: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)

基准测试的学分属于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)小数据

enter image description here

enter image description here

enter image description here

<强> 2。中数据

enter image description here

enter image description here

enter image description here

第3。大数据

enter image description here

enter image description here

enter image description here

<强>观察

  1. 如果仔细查看中型和大型数据的NNZSUM性能图,您会发现10%和{90%和{50%和{ {1}}零个案。对于SUM零的情况,NNZSUM方法之间的性能差距相对较大。

  2. 作为所有数据量和零的所有三个分数情况的一般观察, sum(A(:)==0)方法似乎是无可争议的赢家。同样,在这里观察到一个有趣的事情,一般案例解决方案sum(~A(:))的表现似乎比{{1}}更好。

答案 1 :(得分:15)

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

sum(~A(:))

这应该比length(find...方案快 10 倍,以防效率很重要。

编辑:如果是NaN值,您可以使用解决方案:

sum(A(:)==0)

答案 2 :(得分:4)

我也会在混音中添加一些东西。您可以使用histc并计算整个矩阵的直方图。您指定第二个参数是应该在哪个容器中收集数字。如果我们只想计算零的数量,我们可以简单地指定0作为第二个参数。但是,如果您在histc中指定矩阵,它将按列操作,但我们希望对整个矩阵进行操作。因此,只需将矩阵转换为列向量A(:)并使用histc。换句话说,这样做:

histc(A(:), 0)

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

答案 3 :(得分:0)

嗯,我不知道我是否回答了这个问题,但您可以按如下方式编写代码:

    % 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