identifying and isolating consecutive numbers

169 views (last 30 days)
Claudia
Claudia on 14 Jun 2012
Commented: Samantha Plesce on 27 Oct 2021
I have a vector, for example, A= [1 2 3 4 14 15 23 24 25 ]
and I want a code that will identify regions of consecutive numbers and separate them into their own array. ie, a code that will split A into
B = [1 2 3 4] C = [14 15] D = [23 24 25]
I would like this code to be able to work on a matrix A of variable length. Any suggestions?
Thank you!

Accepted Answer

Maziyar
Maziyar on 8 Oct 2015
Edited: Maziyar on 8 Oct 2015
A(end+1) = 2 % Add a new isolating point end
I_1 = find(D ~= 1); % Find indexes of isolating points
[m,n] = size(I_1);
Start_Idx = 1 ; % Set start index
for i = 1:n
End_Idx = I_1(i); % Set end index
Sequ = A(Start_Idx:End_Idx) % Find consecuative sequences
Start_Idx = End_Idx + 1;
% update start index for the next consecuitive sequence
end
  4 Comments
Samantha Plesce
Samantha Plesce on 27 Oct 2021
I was trying to use this snipet for the same application. I have been testing it with various arrays that contain consecutive sequences. I am having an issue with actually finding the correct set of sequences.
When A = ...
A= [2 4 5 7 8 9 10 -3 -2 -1 0 20] % your array of values
The desired seq cell array should contian:
{[4 5], [7 8 9 10], [-3 -2 -1 0]}
While these sets do appear in the seq cell array, it is also accounting for the first and last value even though they are not apart of a sequence of consecutive values.
seq =
1×5 cell array
{[2]} {1×2 double} {1×4 double} {1×4 double} {[20]}

Sign in to comment.

More Answers (3)

Walter Roberson
Walter Roberson on 14 Jun 2012
The splits should occur at places where diff(A) has 1's . (You can find the runs of 1's by looking at diff(diff(A)).
Once you know the length of each piece, you can use mat2cell() to break up the vector into cell arrays. (Writing to individual variables is not a good practice for something like this.)
  1 Comment
Diego Tasso
Diego Tasso on 14 Jun 2012
Follow what Mr. Walter Roberson said he is most correct.

Sign in to comment.


Diego Tasso
Diego Tasso on 14 Jun 2012
Use regexp to do this, something like ( but not exactly):
[B] = regexp(A,'[1-4]','match')
repeat for C and D replacing [1-4] with the number ranges you want to isolate...this might work...not sure.
  2 Comments
Guillaume
Guillaume on 8 Oct 2015
regexp is a cheap and efficient way of locating patterns in strings. It does not apply to numbers.
A loop is the most inefficient way of dealing with the problem.

Sign in to comment.


Frank Uhlig
Frank Uhlig on 5 May 2020
Edited: Frank Uhlig on 5 May 2020
Here is a simple sequence that gives the adjacent integers without the non-adjacent ones:
Strat with k = [ 1 2 3 4 7 8 9 12 13 140],
>> k = [ 1 2 3 4 7 8 9 12 13 140],
k =
1 2 3 4 7 8 9 12 13 140
>> i = find(diff(k) == 1),
i =
1 2 3 5 6 8
>> all = unique(sort([k(i),k(i)+1]))
all =
1 2 3 4 7 8 9 12 13
And you have all adjacent integer groups united in ascending order.
Sorting the last output into individual adjacent integer groups now is another problem.

Community Treasure Hunt

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

Start Hunting!