在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
,如果原始元素为0,则对除0以外的任何其他元素应用true
false
基准测试的学分属于DivarkarA = [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)
标杆管理 使用以下参数和输入,可以使用
对此处提供的解决方案进行基准测试 输入大小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(:)
不能转换为逻辑。@Nemallahzarmehi然后使用NaN
,同样的思想,我首先写了sum(a(:)==0)
并将其编辑为sum(a(:)==0)
选项……或者如果你真的坚持~A
,还有~
)。@Dev iL-当然可以,但我只是本着一句话的精神回答:)nansum(~A(:)
如果你自己实现它,那不是一行:(.不过,这是一个很好的解决办法。@rayryeng如果矩阵有一个nansum
元素,你就不能使用NaN
),因为sum(~a(:)
不能转换为逻辑。@Nemallahzarmehi然后使用NaN
,同样的思想,我第一次写了sum(a(:)==0)
并将其编辑为sum(a(:)==0)
选项……或者如果你真的坚持~A
,还有~
)。@Dev iL-当然可以,但我只是本着一句话的精神回答:)nansum(~A(:)
如果你自己实现它,那不是一行:(.不过,这是一个很好的解决方法。这与问题要求的相反,即零元素的数量而不是非零元素。您需要执行nansum
或其他操作numel(a)-nnz(a)
- 小型数据大小-