
Question:
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.
Solution:1
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)
Solution:2
You can use the hist function for that. Specify an output, and force the bins to be integers over the range of your array.
list = [1 2 2 3 1 3 2 2 2 1 5]; bins = min(list):max(list); counts = hist(list,bins);
Solution:3
So, this is basically a histogram. Off my memory - look for the HIST function.
Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
EmoticonEmoticon