How to find an exact sequence of values?

5 vues (au cours des 30 derniers jours)
Pete
Pete le 29 Nov 2019
Hi everyone,
as the title says I'm looking to find an exact sequence of values in a matrix. I have a matrix that I'm turning into a logical array as below. Now I want to be able to say if the consecutive ones in the column are less than X (as in e - see below) they should also be turned into zeroes as well.
I tried to work with find(contain()) but that did nothing. Also ismember() did not turn out the results I was looking for.
Turning matrix into binary representation
for k = 1:1:size(p,1)
for l = 1:1:(size(p,2))
if p(k,l) > z
p(k,l) = 1;
else
p(k,l) = 0;
end
end
end
Logical array
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0
0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0
0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0
0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1
Size of ones I would like to be able to filter
e = ones(x,1)
Thank you for your help everyone! It's greatly appreciated.
Cheers,
Peter
  6 commentaires
dpb
dpb le 2 Déc 2019
Show us what you tried with runlength -- can't imagine it would not work to do the job...and actually, what regexp pattern you used. I'm no whizard on regular expressions but there are those here who are.
Pete
Pete le 3 Déc 2019
Luna's approach worked very well. Thank you for your input everyone!

Connectez-vous pour commenter.

Réponse acceptée

Luna
Luna le 2 Déc 2019
Modifié(e) : Luna le 2 Déc 2019
Try Loren's findpattern2. Here is link:
create vector x numbers of ones and run findpattern2.
e = ones(1,x);
for i = 1:size(LogicalArray,2)
indices = findpattern2(LogicalArray(:,i),e);
if ~isempty(indices) % if it finds x elements of this pattern make them zero.
for k=1:numel(indices)
LogicalArray(indices(k):indices(k)+x,i) = false; % from indice to pattern length will be zero
end
end
end
  2 commentaires
Pete
Pete le 3 Déc 2019
That worked perfectly! Thank you
Luna
Luna le 3 Déc 2019
Your welcome :)

Connectez-vous pour commenter.

Plus de réponses (1)

Image Analyst
Image Analyst le 3 Déc 2019
If you want to use functions already built in to the toolbox, you can use bwareafilt:
binaryImage = logical([...
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0
0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0
0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0
0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1])
x = 4; % Whatever....
% Get rid of stretches of 1's in each row that are less than x long.
for row = 1 : size(binaryImage, 1)
binaryImage(row, :) = bwareafilt(binaryImage(row, :), [x, inf]);
end
The result is:
binaryImage =
17×16 logical array
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits


Version

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by