例如,我有一个名为A的NxM矩阵。经过一些处理后,我想要计算零个元素。我如何在一行代码中做到这一点?我尝试了A==0,它返回一个2D矩阵。
发布于 2014-08-15 15:40:08
有一个函数可以找到非零矩阵元素的个数nnz。您可以在逻辑矩阵上使用此函数,它将返回true的数量。
在本例中,我们对矩阵A==0应用nnz,因此逻辑矩阵的元素为true,如果原始元素为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 = round(rand(N)*5);
A = rand(N);A(A<=0.5)=0;
A = rand(N);A(A<=0.9)=0;结果如下所示-
1)小型数据化



2. Medium数据化



3.对进行大数据化



Observations
NNZ和SUM性能图,您会注意到,在10%和90%为零的情况下,它们的性能越来越接近。对于50%为零的情况,SUM和NNZ方法之间的性能差距相对较大。SUM方法似乎是无可争议的赢家。这里还观察到一件有趣的事情,一般情况下的解决方案sum(A(:)==0)似乎比sum(~A(:)).的性能更好
发布于 2014-08-15 12:41:08
一些基本的matlab知识:(:)运算符将任何矩阵展平为列向量,~是将零转换为一,非零值转换为零的NOT运算符,然后我们只需使用sum:
sum(~A(:))在效率很重要的情况下,这也应该比length(find...方案快大约10倍。
编辑:在NaN值的情况下,您可以求助于解决方案:
sum(A(:)==0)发布于 2014-08-15 13:56:48
我也会在这个组合中添加一些东西。您可以使用histc并计算整个矩阵的直方图。将第二个参数指定为应收集数字的存储箱。如果我们只想计算0的个数,我们可以简单地指定0作为第二个参数。但是,如果您在histc中指定一个矩阵,它将沿着列进行操作,但我们希望对整个矩阵进行操作。因此,只需将矩阵转换为列向量A(:)并使用histc即可。换句话说,这样做:
histc(A(:), 0)这应该等同于计算整个矩阵A中的零的数量。
https://stackoverflow.com/questions/25321341
复制相似问题