In a logical array index the area with the most TRUE values

1 Ansicht (letzte 30 Tage)
Below I have a logical vector:
t=[0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0];
which has 5 TRUE areas and 6 FALSE areas. The 3rd TRUE area has the most TRUE elements of all TRUE areas.
How can I index it logically? To be more specific I want to get the following result:
t=[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0];
Thank you!

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 18 Aug. 2013
Bearbeitet: Andrei Bobrov am 18 Aug. 2013
t=[0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0];
ii = 3;
out = cumsum([false;diff(t(:))==1]) == 3 & t(:);
or
a = cumsum([false;diff(t(:))==1]);
aa = a(t>0);
[~,ii]=max(histc(aa,unique(aa))); % or: [~,ii]=max(accumarray(aa,aa,[],@numel));
out = a == 3 & t(:);
or with Image Processing Toolbox
C = bwlabel(t);
Z = regionprops(C,'Area');
[~,ii] = max([Z.Area]);
out = C == ii;
or mix
[~,ii] = min(strfind([0,t(:)'],[0 1])-strfind([t(:)',0],[1 0]));
out = ii == bwlabel(t(:)');
  6 Kommentare
Andrei Bobrov
Andrei Bobrov am 18 Aug. 2013
I agree. Use a = cumsum(diff([0;t(:)])==1);
Giorgos Papakonstantinou
Giorgos Papakonstantinou am 18 Aug. 2013
Thank you Andrei for the complete and extensive answer!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Azzi Abdelmalek
Azzi Abdelmalek am 13 Aug. 2013
Bearbeitet: Azzi Abdelmalek am 13 Aug. 2013
t=[0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0];
a=find(diff([0 t 0]));
idx1=a(1:2:end);
idx2=a(2:2:end)-1;
[~,nmax]=max(idx2-idx1);
t=zeros(1,numel(t));
t(idx1(nmax):idx2(nmax))=1

Community Treasure Hunt

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

Start Hunting!

Translated by