how to find mode without built-in mode function?
显示 更早的评论
any suggestions how to write a function that finds a vectors mode WITHOUT using the built-in mode function?
回答(3 个)
the cyclist
2013-6-9
1 个投票
You could use the hist() function, and use the value that has the highest count.
5 个评论
izabela kudela
2017-1-3
How can I precisely read which value has the highest count?
Walter Roberson
2017-1-3
[counts, centers] = hist(YourVector);
[~, maxidx] = max(counts);
mode_value = centers(maxidx);
Louise Wade
2021-1-6
This gives me non-integer values when all values in my array are integers.
the cyclist
2021-1-7
I think this is because by default, hist() chooses the bin centers by an algorithm that does not guarantee they are in the original vector. Try this instead:
[counts, centers] = histcounts(YourVector,[unique(YourVector) Inf]);
[~, maxidx] = max(counts);
mode_value = centers(maxidx);
the cyclist
2021-1-7
I realized that that code will not find all the modes, if there are multiple. This code should:
[counts, centers] = histcounts(YourVector,[unique(YourVector) Inf]);
max_value = max(counts);
max_idx = (counts==max_value);
mode_values = centers(max_idx)
Walter Roberson
2013-6-9
1 个投票
unique(), take the third output, put it through accumarray(), find the max()
Roger Stafford
2013-6-9
编辑:Roger Stafford
2013-6-9
If you are not allowed to use the 'mode' function, it sounds as though you must use only more primitive functions. Are you allowed to do the following with v as the given column vector?
u = sort(v);
f = find([true;diff(u)~=0;true]);
[~,ix] = max(diff(f));
m = u(f(ix)); % m is most frequent value occurring in v
(Corrected)
5 个评论
dana
2013-6-9
Roger Stafford
2013-6-9
There's nothing magic about it. I'll give an example. Let v be:
v = [9;4;2;4;9;2;4]
Then you get
u = sort(v) = [2;2;4;4;4;9;9]
diff(u) = [0;2;0;0;5;0]
diff(u)~=0 = [F;T;F;F;T;F] Where 'T' & 'F' stand for true & false
[true;diff(u)~=0;true] = [T;F;T;F;F;T;F;T]
f = find([true;diff(u)~=0;true]) = [1;3;6;8]
diff(f) = [2;3;2]
max(diff(f)) is max at second value, hence ix = 2
f(ix) = f(2) = 3
m = u(f(ix)) = u(3) = 4 Therefore the mode value is 4
Does that show you the principles involved?
Louise Wade
2021-1-6
I am trying this and I am getting the below error. Sorry to bring this up on a 7.5 year comment, it's just relevant to something I am doing right now.
Error using vertcat
Dimensions of arrays being concatenated are not consistent.
Error in Question_1 (line 29)
f = find([true;diff(u)~=0;true]);
That depends on the dimensions of v. If it is a column vector this runs without error.
v = [9;4;2;4;9;2;4];
u = sort(v);
[true;diff(u)~=0;true]
v = [9;4;2;4;9;2;4];
v = v.';
u = sort(v);
[true;diff(u)~=0;true]
Louise Wade
2021-1-7
编辑:Louise Wade
2021-1-7
I'll try and transpose my row vector into a column vector and try again. If there are multiple values as the mode, would this cause an issue?
EDIT: It seems to be working for me. Thank you so much for helping. All I needed to do was transpose the array.
类别
在 帮助中心 和 File Exchange 中查找有关 Creating, Deleting, and Querying Graphics Objects 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!