size of nonzero entries in each row of a matrix without loop
22 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Maider Marin
am 8 Feb. 2011
Kommentiert: Mbvalentin
am 14 Mär. 2016
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 Kommentare
Akzeptierte Antwort
Walter Roberson
am 8 Feb. 2011
c = sum(h~=0,2);
6 Kommentare
Paulo Silva
am 15 Mär. 2011
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.
Weitere Antworten (3)
stef stef
am 15 Mär. 2011
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 Kommentar
Mbvalentin
am 14 Mär. 2016
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
am 15 Mär. 2011
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 Kommentare
Gabriel
am 2 Jul. 2013
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 Kommentare
Siehe auch
Kategorien
Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!