# search through an array for patterns and put into cell arrays.

2 views (last 30 days)
lightroman on 14 Nov 2017
Answered: Kelly Kearney on 14 Nov 2017
Looking to search through a large array of integers and find patterns of up to 1-10 ( can be 1 or 1 2 3 or 1 2 3 4 5 6 .. 10, etc) and place those into cell arrays. Resulting multiple cell arrays of different lengths. A is really long so I was hoping to avoid lengthy loops, in which I figured out a way using ismember and a very very long inefficient loop.
I do not know how many patterns of 1-10 exist. Is this possible? Thanks.
if true
A = [ 1 2 3 78 28 92 1 76 89 23 87 1 2 3 4 5 6 7 8 9 10 72 91 72]
result{1} = {1 2 3}
result{2} = {1}
result{3} = {1 2 3 4 5 6 7 8 9 10}
end

Kelly Kearney on 14 Nov 2017
This sort of problem can usually be solved by using a various combinations of diff:
A = [ 1 2 3 78 28 92 1 76 89 90 23 87 1 2 3 4 5 6 7 8 9 10 72 91 72];
isnew = [true ~(diff(A) == 1)]; % is each elemet 1 greater than previous?
sidx = find(isnew); % indices of start of each run
nper = diff([sidx length(A)+1]); % number of elements in each run
consec = mat2cell(A, 1, nper); % break matrix into cells of runs
consec1 = consec(is1); % keep only cells starting with 1
Result:
>> consec1{:}
ans =
1 2 3
ans =
1
ans =
1 2 3 4 5 6 7 8 9 10