How can I find 4 or more character pattern in number array
7 views (last 30 days)
Show older comments
I have an array like this A=[1 2 3 2 5 12 3 9 12 3 5 6 3 2 5 11 10 9] (array size (1,275)
I am trying to find 4 or more character pattern in this array.
how can I do this?
6 Comments
Answers (6)
Wayne King
on 23 Jan 2013
Edited: Wayne King
on 23 Jan 2013
See Loren's blog here:
You can use strfind with an array of numbers
A = [1 2 3 2 5 12 3 9 12 3 5 6 3 2 5 11 10 9];
% find
B = [9 12 3];
K = strfind(A,B);
K is the starting index of the pattern in the array, A.
A(K:K+1+length(K))
7 Comments
Laura Proctor
on 23 Jan 2013
If you define the pattern that you're looking for as x, for example
x = [3 9 12 3]
then you can find the starting index value for this pattern by using the following code:
n = length(x);
ind = 1:length(A);
for k = 1:n
i1 = find(A==x(k));
ind = intersect(ind,i1-k+1);
end
4 Comments
Image Analyst
on 23 Jan 2013
That doesn't make sense. You have to be searching A for some pattern. Otherwise, you might as well just pick any 4 adjacent indexes from A at random.
Cedric
on 23 Jan 2013
Edited: Cedric
on 23 Jan 2013
And here is a funny solution:
A = [1 2 3 2 5 12 3 9 12 3 5 6 3 2 5 12 3 9] ; % Notes
p = [5 12 3 9] ; % Pattern
nA = numel(A) ; np = numel(p) ;
buffer = ~any(spdiags(repmat(A(:), 1, np), 0:np-1, nA, nA) - ...
spdiags(repmat(p, nA, 1), 0:np-1, nA, nA), 2) ;
loc = find(full(buffer(1:nA-np+1)))
This code gives loc = 5, 15.
Cheers,
Cedric
0 Comments
Image Analyst
on 23 Jan 2013
If you have the Image Processing Toolbox you can use normxcorr though it looks like Loren's method is simpler:
% Define sample data.
A=[1 2 3 2 5 12 3 9 12 3 5 6 3 2 5 11 10 9]
% Define the sequence of numbers we want to find.
patternToFind = [5 12 3 9]
% Compute the normalized cross correlation.
normCrossCorr = normxcorr2(patternToFind, A)
% Find index where the sequence starts.
% This is where the normalized cross correlation = 1.
startingIndexOfSequence = find(normCrossCorr >= 0.999999) - length(patternToFind) + 1
0 Comments
Walter Roberson
on 23 Jan 2013
At each step, K,
conv(A(K+4:end), -1./A(K:K+3), 'valid')
should, I think, become within round-off of 0 at each point at which there is a match.
Or,
B = A(K:K+3);
T = A(K+4:end);
find(T(1:end-3) == B(1) & T(2:end-2) == B(2) & T(3:end-1) == B(3) & T(4:end) == B(4), 1, 'first')
There is a vectorized solution for the entire similarity search all at once, that involves constructing a comparison array (it might have to be multidimensional); it might become impractical for larger input vectors.
0 Comments
Jan
on 24 Jan 2013
According to Wayne King's answer:
data = randi([1,12], 1, 275);
for k = 1:length(data) - 3
search = data(k:k+3);
match = k - 1 + strfind(data(k:end), search);
if length(match) > 1
fprintf('Match: [ ');
fprintf('%d ', search);
fprintf(']: \n ');
fprintf(' %d', match);
fprintf('\n');
end
end
0 Comments
See Also
Categories
Find more on Matrix Indexing 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!