I want to get better at vectorizing my loops in MATLAB. At the moment, I'm trying to count the occurrences of values in a list of ints. My code is similar to this:
list = [1 2 2 3 1 3 2 2 2 1 5];
occurrence_list = zeros(1,max(list));
for x=list
occurrence_list(x) = occurrence_list(x) + 1;
end
Is there a simple vectorized replacement for that for loop? (Or is there a built in MATLAB function that I'm missing?) I'm doing this on pretty small data sets, so time isn't an issue. I just want to improve my MATLAB coding style.
In addition to the HIST/HISTC functions, you can use the ACCUMARRAY to count occurrence (as well as a number of other aggregation operations)
counts = accumarray(list(:), 1)
%# same as: accumarray(list(:), ones(size(list(:))), [], @sum)
Another way is to use TABULATE from the Statistics Toolbox (returns value,count,frequency):
t = tabulate(list)
t =
1 3 27.273
2 5 45.455
3 2 18.182
4 0 0
5 1 9.0909
Note that in cases where the values don't start at 1m or in case there's large gaps between the min and the max, you will get a lot of zeros in-between the counts. Instead use:
list = [3 11 12 12 13 11 13 12 12 12 11 15];
v = unique(list);
table = [v ; histc(list,v)]'
table =
3 1
11 3
12 5
13 2
15 1
representing the unique values and their counts (this will only list values with at least one occurrence)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With