Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Function to find the more recurrent number

Asked by Liber-T on 8 Aug 2011

Hye, I have a matrix 1 by (a big number, like 1000), and I would like to extract the element of the matrix that appears most of the time.

Can you help me?

0 Comments

Liber-T

Products

No products are associated with this question.

4 Answers

Answer by Friedrich on 8 Aug 2011
Accepted answer

Hi,

i think the hist function can help here:

%create some random numbers between 1 and 20
a = ceil(rand(100,1)*20);
%put them in as much bin as different numbers exists
n = hist(a,numel(unique(a)));
%show the histogram
hist(a,numel(unique(a)));
%number appears most
element = find(n == max(n))
%numel(find(a==element)) should return the same as max(n)

2 Comments

Liber-T on 8 Aug 2011

Let say we have this vector: Y= 0.0084 0.0084 0.0084 0.0084 0.0084 0.0084 0.0084 0.0084 0.0084 0.0084 5.9139 5.9432 5.9140 5.9432 5.9434 5.9139

The element that appear the most is 0.0084, and that is the answer I want to extract in this case. I want the program to do it by itself. I used the line x=find(Y==max(Y)), but it give me 15. What have I done wrong?

Friedrich on 8 Aug 2011

You have to do:

>> Y_un = unique(Y);
>> n = hist(Y,numel(Y_un));
>> element = find(n == max(n));
>> most_occ = Y_un(element)

Friedrich
Answer by Walter Roberson on 8 Aug 2011

Much more simple:

x = mode(Y);

5 Comments

Paulo Silva on 8 Aug 2011

the mode function was introduced in the Service Pack 3 of Release 14 back in Setember 2005, I think it's the first time I see it, thanks for bring it up Walter :)

Liber-T on 9 Aug 2011

function X=modi(Y)
%Y is a vector, it cannot be a matrix, reshape it before entering it in
%modi.
%First, FOR MY NEED, I adjust the value of Y
Y=round(10000*Y)/10000;
%Parameter used in the boucle.
n=length(Y);
%Preallocation of the memories for the matrix T
T(2,n)=0;
%For the first iteration, the first row of T is the different value of Y,
%the second is number of time the value appears.
T(1,1)=Y(1);
T(2,1)=1;
%This is a parameter to know where will go the next new value in the matrix
%T.
s=1;
for j=2:n %First boucle to pass every element of Y.
for i=1:s %Second boucle to compare the value of Y(j) with every value of T.
k=1; %Parameter of control to know if the value exist in T or not
if Y(j)==T(1,i) %Condition to adjust the count of the value Y(j), if not already in T, the value will be added after.
T(2,i)=T(2,i)+1;
k=0;
break
end
end
if k==1 %If the value didn't exist in T, it is now added.
s=s+1;
T(1,s)=Y(j);
T(2,s)=1;
end
end
%Now looking for the most recurrent value by comparing the value of the
%second row.
H=T(2,1);
d=1;
for j=2:s
if H<T(2,j)
H=T(2,j);
d=j;
end
end
%Time to give the answer.
X=T(1,d);

Liber-T on 9 Aug 2011

I've programmed one that dos the job for me, if someone need it. Just make sure it's good for you, cause at the line 5, I added a line that might create some problem, you can just erase it.

Walter Roberson
Answer by Paulo Silva on 8 Aug 2011

Another possible way

a=randi([1 20],1,1000);
u=unique(a);
[C,I]=max(arrayfun(@(x)sum(a==u(x)),1:numel(u)));
disp('The value that appears most times is:')
u(I)
disp('Number of times it appears:')
C

In case of having two values that appear the same number of times it will choose just one of them.

0 Comments

Paulo Silva
Answer by huda nawaf on 10 Aug 2011

hi, see it please,

X=[1 1 1 2 3 4 4 4 0]; >> v=mode(X) ??? No appropriate methods for function mode. . I need the mode which compute frequencies of appearing of number. thanks

1 Comment

Liber-T on 10 Aug 2011

function T=modi(Y)
%Y is a vector, it cannot be a matrix, reshape it before entering it in
%modi.
%Parameter used in the boucle.
n=length(Y);
%Preallocation of the memories for the matrix T
T(2,n)=0;
%For the first iteration, the first row of T is the different value of Y,
%the second is number of time the value appears.
T(1,1)=Y(1);
T(2,1)=1;
%This is a parameter to know where will go the next new value in the matrix
%T.
s=1;
for j=2:n %First boucle to pass every element of Y.
for i=1:s %Second boucle to compare the value of Y(j) with every value of T.
k=1; %Parameter of control to know if the value exist in T or not
if Y(j)==T(1,i) %Condition to adjust the count of the value Y(j), if not already in T, the value will be added after.
T(2,i)=T(2,i)+1;
k=0;
break
end
end
if k==1 %If the value didn't exist in T, it is now added.
s=s+1;
T(1,s)=Y(j);
T(2,s)=1;
end
end
for j=n:-1:1
if T(2,j)==0
T(:,j)=[];
else
break
end
end

I change my code, and this one should return you a matrix of two row. The first row gives you the different number, and the second row return you the frequencies of their appearence. I didn't test it.

huda nawaf

Contact us