# Array splitting in sub-arrays of consecutive elements

I want to split an array in sub-arrays of consecutive elements. For example, for the array:

a=[1 2 3 6 7 9 10 15]


I want an output 1 2 3, 6 7, 9 10, 15.

I think that the natural choice is to use a struct for this:

[v,x] = find(diff(a)>1) %find "jumps"

xx=[0 x length(a)]

for ii=1:length(xx)-1
cs{ii}=a(xx(ii)+1:xx(ii+1)); %output struct array
end


v =

 1     1     1


x =

 3     5     7


xx =

 0     3     5     7     8


The code works correctly but I was wondering if there are smarter ways to do this.

• You're using a cell array, not a struct. – Cris Luengo Dec 10 '17 at 2:22

You should preallocate the cs cell array:

[v,x] = find(diff(a)>1); %find "jumps"
xx = [0 x length(a)];
cs = cell(length(a)+1,1);
for ii = 1:length(xx)-1
cs{ii} = a(xx(ii)+1:xx(ii+1));
end


You could take advantage of accessing array's elements via colon notation. For example, if you need to extract the first three elements of an array a=[7 9 6 4 5 8], you type b=a(1:3). These statements are equivalent a(1:1:3)=a(1:3)=a([1 2 3]) which return the first three elements. In your example, it is a matter of controlling the indexes for colon notation, therefore,
a=[1 2 3 6 7 9 10 15];