finding a numeric pattern in an array

4 views (last 30 days)
Hi all,
I have a big numeric vector and I am trying to find a pattern in the vector.
Example:
my numeric vector = [11 5 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 11 2 31 5 1 2 11 2 31 5 1 2 11 2 31 5 1 2 11 2 31 5 1 2 11 2 31 5 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 11 2 31 5 1 2 11 2 31 5 1 2 11 2]
pattern : [1 2 3 4 5 *any numbers* 1 2 3 4 5 1 2 11 2 31]
I know strfind works well if I know the exact sequence of pattern. But for the above case I am unable to find the solution.

Accepted Answer

Stephen23
Stephen23 on 27 Mar 2023
Edited: Stephen23 on 27 Mar 2023
V = [11,5,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,11,2,31,5,1,2,11,2,31,5,1,2,11,2,31,5,1,2,11,2,31,5,1,2,11,2,31,5,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,11,2,31,5,1,2,11,2,31,5,1,2,11,2]
V = 1×133
11 5 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
F = @(v) regexptranslate('escape',char(v));
P = sprintf('%s.*?%s',F([1,2,3,4,5]),F([1,2,3,4,5,1,2,11,2,31]))
P = '□□□□□.*?□□□□□□□□□□'
[X,Y,M] = regexp(char(V),P, 'start','end','match') % start & end indices, matched text.
X = 1×2
6 64
Y = 1×2
35 122
M = 1×2 cell array
{'□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□'} {'□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□'}
Checking the matched content:
double(M{1})
ans = 1×30
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 11 2 31
double(M{2})
ans = 1×59
1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
  3 Comments
Saikrishna
Saikrishna on 27 Mar 2023
@Stephen23 excellent! Thank you :) that worked for me perfectly

Sign in to comment.

More Answers (1)

Dyuman Joshi
Dyuman Joshi on 27 Mar 2023
Edited: Dyuman Joshi on 27 Mar 2023
vec=[11 5 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 11 2 31 5 1 2 11 2 31 5 1 2 11 2 31 5 1 2 11 2 31 5 1 2 11 2 31 5 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 11 2 31 5 1 2 11 2 31 5 1 2 11 2];
pat1 = 1:5;
pat2 = [pat1 1 2 11 2 31];
%Starting index of pattern 1
idx1=strfind(vec,string(pat1))
idx1 = 1×15
6 11 16 21 26 64 69 74 79 84 89 94 103 108 113
%Ending index of pattern 2
idx2=strfind(vec,string(pat2))+numel(pat2)-1
idx2 = 1×2
35 122
Any viable combination of elements of idx1 to idx2 will be the pattern i.e. 6-35, 11-35, 16-35, 6-122, 64-122, ...
A viable combination is idx1(m)<idx2(n)

Categories

Find more on Characters and Strings in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!