search through an array for patterns and put into cell arrays.
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
lightroman
le 14 Nov 2017
Réponse apportée : Kelly Kearney
le 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
0 commentaires
Réponse acceptée
Kelly Kearney
le 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];
(I modified your example by one element to add a run that didn't start with 1, just in case...)
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
is1 = A(sidx) == 1; % does run start with 1?
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
0 commentaires
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Whos 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!