我有一个NxM
矩阵,例如名为A
。在一些过程之后,我想要计算零元素。
如何在一行代码中执行此操作?我尝试了A==0
,它返回了一个2D矩阵。
答案 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
改变零的百分比
A = round(rand(N)*5);
A = rand(N);A(A<=0.5)=0;
A = rand(N);A(A<=0.9)=0;
结果如下所示 -
1)小数据
<强> 2。中数据
第3。大数据
<强>观察强>
如果仔细查看中型和大型数据的NNZ
和SUM
性能图,您会发现10%
和{90%
和{50%
和{ {1}}零个案。对于SUM
零的情况,NNZ
和SUM
方法之间的性能差距相对较大。
作为所有数据量和零的所有三个分数情况的一般观察,
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