size of nonzero entries in each row of a matrix without loop
17 次查看(过去 30 天)
显示 更早的评论
Let's explained with an example if I have h =
0 1 2 3
1 0 0 0
5 0 1 0
there is any function that will return the number of nonzero elements per row something like c =
3
1
2
but without a loop. I know I can use nnz per row
something like
for i=1: numRows
c(i)=nnz(h(i,:));
end
but there is any way to do it without a loop?
I will really appreciate any suggestions
0 个评论
采纳的回答
Walter Roberson
2011-2-8
c = sum(h~=0,2);
6 个评论
Paulo Silva
2011-3-15
B = sum(A,dim) sums along the dimension of A specified by scalar dim. The dim input is an integer value from 1 to N, where N is the number of dimensions in A. Set dim to 1 to compute the sum of each column, 2 to sum rows, etc.
更多回答(3 个)
stef stef
2011-3-15
thank you Walter!Your answer worked fine with me, although i didn't exactly understand what 0,2 does..I thought sum was only to add values of elements.
1 个评论
Mbvalentin
2016-3-14
It's not a decimal point (like a = 0,2). The comma is just dividing the two input arguments that the 'sum' function can take. In this case he is first creating a logical matrix that has ones for every element in h that is not equal to 0 (that's what h ~= 0 does), and then this result vector is inputed in the sum function.
Now, the sum function does the summatory of the input vector (or matrix) in a certain direction. The default direction is '1' (this is, along the row direction). I.E., assume we have the following matrix:
M = [10 10 0; 0 10 1; 1 0 1];
The result of L = (M ~= 0) would be:
L = [1 1 0; 0 1 1; 1 0 1];
Now, the results of the sum of 'M' on each direction are:
sum(M,1) = [11, 20 2]; sum(M,2) = [20; 11; 2].
As the result of the logical matrix L is a one row vector, we need to add the values along the 'columns-direction', which is '2'. That's why here Walter used the sum(MATRIX,2), to sum along the columns.
Paulo Silva
2011-3-15
Another option but not so good like Walter suggestion
a=[0 1 2 3
1 0 0 0
5 0 1 0]
sum(arrayfun(@any,a(1:size(a,1),:)),2)
ans =[3;1;2]
0 个评论
Gabriel
2013-7-2
Keep in mind, the previous answers may work, but they require a lot of memory if your array is big (basically duplicates it).
If working with a LOT of data and facing out of memory errors, the for loop with nnz might be the way to go.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!