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

15 views (last 30 days)
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

Accepted Answer

Jan
Jan on 22 Jun 2015
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 Comments

Sign in to comment.

More Answers (3)

Ingrid
Ingrid on 22 Jun 2015
try using the diff function before calling find
  4 Comments
Stephen23
Stephen23 on 22 Jun 2015
Edited: Stephen23 on 22 Jun 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

Sign in to comment.


Andrei Bobrov
Andrei Bobrov on 22 Jun 2015
Edited: Andrei Bobrov on 22 Jun 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 Comments
yashvin
yashvin on 26 Jun 2015
@ 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!

Sign in to comment.


Azzi Abdelmalek
Azzi Abdelmalek on 22 Jun 2015
Edited: Azzi Abdelmalek on 22 Jun 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];

Categories

Find more on Performance and Memory in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!