How to get the starting and ending index of repeated numbers in an array?

Hi MY array is =[2 2 1 2 3 2 2 2 2 2 3 5 6 7 7 7 7 6 5]
I am trying to find the starting and index index of repeated numbers in my array
for example,
for number 2, i expect startingindex=1 and endingindex=2 as it is repeated and also startingindex=6th and endingindex=10.
for number 7, i expect startingindex=14 and endingindex=17
I have been trying using find so far but in vain

 Respuesta aceptada

An another question from the forum concerning a run-length-encoding. With FEX: RunLength:
X = [2 2 1 2 3 2 2 2 2 2 3 5 6 7 7 7 7 6 5];
[B, N, Ind] = RunLength(X);
Ind = [Ind, length(X)+1];
Multiple = find(N > 1);
Start = Ind(Multiple);
Stop = Ind(Multiple + 1) - 1;

4 comentarios

Is runlength a separate script? I am using MATLAB R2014b..i am getting an error..
Yes, it's a separate function (not a script). Jan did provide the link to it in his answer.
As indicated in the above answer, you can get RunLength function in this link http://www.mathworks.com/matlabcentral/fileexchange/41813-runlength
Thanks!! works perfectly

Iniciar sesión para comentar.

Más respuestas (3)

Ingrid
Ingrid el 22 de Jun. de 2015
try using the diff function before calling find

4 comentarios

diff(MY array)
0 -1 1 1 -1 0 0 0 0 1 2 1 1 0 0 0 -1 -1
it gives me little information about the starting and ending indices of repeated arrays!
diff is going to be the starting point of any answer related to finding repeated sequences. It transforms the repeated sequences into 0 and thus transform the problem from finding transitions between arbitrary numbers into finding transitions from non-zero to zero and back. The latter is much easier to solve.
Stephen23
Stephen23 el 22 de Jun. de 2015
Editada: Stephen23 el 22 de Jun. de 2015
@yashvin: notice that Ingrid mentioned two functions: diff and find. You only tried the first function, but you missed the find.
>> V = [2 2 1 2 3 2 2 2 2 2 3 5 6 7 7 7 7 6 5];
>> X = diff(V)~=0;
>> B = find([true,X]) % begin of each group
B =
1 3 4 5 6 11 12 13 14 18 19
>> E = find([X,true]) % end of each group
E =
2 3 4 5 10 11 12 13 17 18 19
>> D = 1+E-B % the length of each group
D =
2 1 1 1 5 1 1 1 4 1 1
Use logical indexing if you only want the groups with more than one element:
>> Y = D>1;
>> B(Y)
ans =
1 6 14
>> E(Y)
ans =
2 10 17
Let me check it and get back to you. Thanks for your input

Iniciar sesión para comentar.

Andrei Bobrov
Andrei Bobrov el 22 de Jun. de 2015
Editada: Andrei Bobrov el 22 de Jun. de 2015
A=[2 2 1 2 3 2 2 2 2 2 3 5 6 7 7 7 7 6 5];
ii = [0, diff(A(:)')==0,0];
i1 = strfind(ii,[0 1]);
i2 = strfind(ii,[1 0]);
out = [A(i1)',i1(:),i2(:)];

2 comentarios

I tried your solution. It is working perfectly so far.
@ Andrei Bobrov
But i am new to strfind. According to
It looks for pattern and the example in the page treats pattern in string mostly. Can you please a little description of the code you had written. Thanks!

Iniciar sesión para comentar.

Azzi Abdelmalek
Azzi Abdelmalek el 22 de Jun. de 2015
Editada: Azzi Abdelmalek el 22 de Jun. de 2015
A=[2 2 1 2 3 2 2 2 2 2 3 5 6 7 7 7 7 6 5];
d1=~diff(A).*(1:numel(A)-1);
idx1=d1.*[1 ~d1(1:end-1)];
idx2=circshift(d1.*[~d1(2:end) 1],[0 1]);
ii1=~~idx1;
out=[A(ii1);idx1(ii1) ;idx2(~~idx2)+1];

Categorías

Más información sobre Characters and Strings en Centro de ayuda y File Exchange.

Preguntada:

el 22 de Jun. de 2015

Comentada:

el 26 de Jun. de 2015

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by