# Count number of times value appears in column

50 views (last 30 days)
Emma Kuttler on 22 Nov 2019
Edited: Image Analyst on 23 Nov 2019
I have a 1000x296 matrix called FinalRanking. The possible values in each cell are between 1 and 296, integers.
I want to count the number of times each number, 1-296, appears in each column, and return this as a 296x296 matrix, lets call it counter.
so for example Counter(1,1) has the value of the number of time 1 appears in Column 1 of FinalRanking.
or Counter(12, 57) returns the value of the number of times 12 appears in Column 57 of FinalRanking.
How would I do this? I'm assuming i need nested for loops. Thanks!

the cyclist on 22 Nov 2019
Edited: the cyclist on 22 Nov 2019
% Parameterize the max value, for convenience
V = 296;
% Some simulated data
FinalRanking = randi(V,1000,V);
% Preallocate the counter array
counter = nan(V,V);
% Loop over the columns, and count the number of times each value appears
for nc = 1:V
counter(:,nc) = histcounts(FinalRanking(:,nc),[1:V Inf]);
end

#### 1 Comment

Emma Kuttler on 22 Nov 2019
This works perfectly, thank you!

Andrei Bobrov on 22 Nov 2019
Edited: Andrei Bobrov on 22 Nov 2019
out = histc(FinalRanking,1:296);

Show 1 older comment
Emma Kuttler on 22 Nov 2019
Thanks, that's a really concise way to do it!
Andrei Bobrov on 22 Nov 2019
"If performance is a problem due to a large number of columns in the matrix, then consider continuing to use histc for the column-wise bin counts." - wrote The Mathworks.
the cyclist on 23 Nov 2019
Make up your mind, MathWorks! :-)

Image Analyst on 22 Nov 2019
Try this:
edges = 1 : 297;
FinalRanking = randi(296, 1000, 296);
counter = zeros(296, 296);
for col = 1 : size(FinalRanking, 2)
counter(:, col) = histcounts(FinalRanking(:, col), edges);
end
imshow(counter, [], 'ColorMap', hsv(256));
axis('on', 'image');
colorbar;
impixelinfo;

Emma Kuttler on 23 Nov 2019
This is interesting! I'm guessing the x axis represents the column and y represents the number of occurences? If so, how do i modify the code to add axis labels?
Image Analyst on 23 Nov 2019
Yes for x. But along the y axis are the histogram bins. The value, "z" value if you want to think of it like that, is the count. But the actual distance/location along the y axis is the bin number, not the "number of occurrences" (counts).
fontSize = 20; % Whatever.
xlabel('Column', 'FontSize', fontSize);
ylabel('Number (i.e., histogram bin)', 'FontSize', fontSize);