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

16 vues (au cours des 30 derniers jours)
yashvin
yashvin le 22 Juin 2015
Commenté : yashvin le 26 Juin 2015
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

Réponse acceptée

Jan
Jan le 22 Juin 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 commentaires
Azzi Abdelmalek
Azzi Abdelmalek le 22 Juin 2015
As indicated in the above answer, you can get RunLength function in this link http://www.mathworks.com/matlabcentral/fileexchange/41813-runlength
yashvin
yashvin le 23 Juin 2015
Thanks!! works perfectly

Connectez-vous pour commenter.

Plus de réponses (3)

Ingrid
Ingrid le 22 Juin 2015
try using the diff function before calling find
  4 commentaires
Stephen23
Stephen23 le 22 Juin 2015
Modifié(e) : Stephen23 le 22 Juin 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
yashvin
yashvin le 26 Juin 2015
Let me check it and get back to you. Thanks for your input

Connectez-vous pour commenter.


Andrei Bobrov
Andrei Bobrov le 22 Juin 2015
Modifié(e) : Andrei Bobrov le 22 Juin 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 commentaires
yashvin
yashvin le 26 Juin 2015
I tried your solution. It is working perfectly so far.
yashvin
yashvin le 26 Juin 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!

Connectez-vous pour commenter.


Azzi Abdelmalek
Azzi Abdelmalek le 22 Juin 2015
Modifié(e) : Azzi Abdelmalek le 22 Juin 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];

Catégories

En savoir plus sur Performance and Memory dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by