How to find the number of repeating sequence in an array?

3 visualizzazioni (ultimi 30 giorni)
A sequence is
011011011001111011111001001011001011011001101001011011001111111.
I'm looking for a sequence of 111 from the above. But the scanning can be done by considering the first three elements(011) and then next three elements(011) and so on.
That is
011,011,011,001,111,011,111,001,001,011,001,011,011,001,101,001,011,011,001,111,111.
Thus four occurrences. Similarly for 1111. Appreciate help.

Risposta accettata

kowshik Thopalli
kowshik Thopalli il 5 Mar 2017
Modificato: kowshik Thopalli il 5 Mar 2017
You can do the following. Treat the sequence as a string. Divide the string into a cell with each cell containing 3 digits. Then use strfind. But this assumes the length of sequence you wish to find is a factor for the total length. Your last line says 1111 but the length of sequence is 63. 63 is not divisible by 4. I Assume you like to do this only till 1:60 of your sequence.
Sequence='011011011001111011111001001011001011011001101001011011001111111';
required='1111'; len_required= length(required);
len_sequence=length(Sequence);
end_point=len_sequence- mod(len_sequence,len_required);
Cell_sequence=cellstr(reshape(Sequence(1:end_point),len_required,[])'); % this will divide the sequence with each cell having 3 digits
Find_sequence=cellfun(@(x) strfind(x,required), Cell_sequence,'UniformOutput',false);
output= sum(cell2mat(Find_sequence))
Hope this helps!
  3 Commenti
Sunil Kunjachan
Sunil Kunjachan il 5 Mar 2017
Hi Kowshik, I just want the output equals 4 (111 show up four times)only. If I go for a sequence like 1111,0110,1100..... What would be the necessary changes to catch the number of 1111 in that sequence. Kindly reply
Image Analyst
Image Analyst il 5 Mar 2017
That's the demo he gave. Unless you wanted to detect the pattern in an overlapping way, rather than in "jumps" of 4. So like 11111 would be 2 instances of 1111. Please explain.

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 5 Mar 2017
You could use histogram():
% Define data.
s = '011011011001111011111001001011001011011001101001011011001111111';
% Figure out how many times each 3 character string shows up.
s3 = reshape(s, 3, [])'
n3 = arrayfun(@str2double, s3)
numbers = n3(:,1)*100 + n3(:, 2)*10 + n3(:, 3) % Convert to numbers.
h = histogram(numbers, 'BinEdges', 0:112) % Count how many times each number occurs.
grid on;
% DONE!
% Just to check, let's print it out to the command window.
for bin = 1 : length(h.Values)
if h.Values(bin) > 0
fprintf('%3.3d shows up %d times.\n', h.BinEdges(bin), h.Values(bin));
end
end
It prints out:
001 shows up 7 times.
011 shows up 9 times.
101 shows up 1 times.
111 shows up 4 times.
  4 Commenti
Image Analyst
Image Analyst il 5 Mar 2017
kowshik, I thought that was a typo, because like you said, the sequence doesn't make sense if you take things in groups of 3 when you're searching for something 4 characters long. The sequence is not a multiple of 4. He didn't say to take them in groups of 4, or 5, or whatever. He said groups of 3. But whatever...
kowshik Thopalli
kowshik Thopalli il 5 Mar 2017
Image Analyst, Thanks for all of your answers. I have immensely benefited through them over years. I know this isnt the right place but can you answer one of my questions regarding the Image datastores. I wish to join two image datastores.

Accedi per commentare.

Categorie

Scopri di più su Characters and Strings in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by