MATLAB: Fast counting how many elements within several ranges

arraycount occurrences

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!

Best Answer

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.
Related Question