필터 지우기
필터 지우기

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

조회 수: 1 (최근 30일)
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!

채택된 답변

Andrei Bobrov
Andrei Bobrov 2013년 8월 18일
편집: Andrei Bobrov 2013년 8월 18일
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
Andrei Bobrov
Andrei Bobrov 2013년 8월 18일
I agree. Use a = cumsum(diff([0;t(:)])==1);
Giorgos Papakonstantinou
Giorgos Papakonstantinou 2013년 8월 18일
Thank you Andrei for the complete and extensive answer!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Azzi Abdelmalek
Azzi Abdelmalek 2013년 8월 13일
편집: Azzi Abdelmalek 2013년 8월 13일
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

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by