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

 채택된 답변

Jan
Jan 2015년 6월 22일
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

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

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Ingrid
Ingrid 2015년 6월 22일

3 개 추천

try using the diff function before calling find

댓글 수: 4

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.
@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

댓글을 달려면 로그인하십시오.

Andrei Bobrov
Andrei Bobrov 2015년 6월 22일
편집: Andrei Bobrov 2015년 6월 22일
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

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!

댓글을 달려면 로그인하십시오.

Azzi Abdelmalek
Azzi Abdelmalek 2015년 6월 22일
편집: Azzi Abdelmalek 2015년 6월 22일
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];

카테고리

도움말 센터File Exchange에서 Characters and Strings에 대해 자세히 알아보기

질문:

2015년 6월 22일

댓글:

2015년 6월 26일

Community Treasure Hunt

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

Start Hunting!

Translated by