Fast counting how many elements within several ranges

Hello everybody! I wish to count how many elements there are in an array named Y that are within range (a;b], how many within range (b;c], how many within range (c,d],... and save each of these values in another array. I have written this code:
k = NaN*zeros(num_sub,1);
for i=2:(num_sub+1)
k(i-1) = sum(Y <= interval_bounds(i) & Y > interval_bounds(i-1));
end
where in interval_bounds I have stored values [a,b,c,d,...] and num_sub is the number of subintervals (which is equal to length(interval_bounds)-1).
Do you think there may be a faster way to do this? Perhaps without using a for cycle?
Thank you in advance!

 Akzeptierte Antwort

Walter Roberson
Walter Roberson am 15 Okt. 2015
Bearbeitet: Walter Roberson am 15 Okt. 2015
tcounts = histc(-Y, fliplr(-[a, b, c, d]) );
counts = fliplr(tcounts(1:end-1));
The reason for taking negatives and using fliplr is that histc uses [x1,x2), [x2,x3), [x3,x4), [x4,x4] as the boundaries, whereas you want (x1, x2], (x2, x3], (x3, x4]. Going for the negative flips the ends around allowing us to construct the boundaries [-x4, -x3), [-x3, -x2), [-x2, -x1), [-x1, -x1] which has the right open/close semantics for your purposes. We then flip the counts end for end to get them in the right order, discarding the [a a] bin as we do so because you are not interested in the counts for values exactly equal to a.
If you were willing to accept semi-open instead of semi-closed then you could just use
counts = histc(y, [a, b, c, d]);
and then discard the last bin which would be the counts for values exactly equal to d.

Weitere Antworten (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by