How can i calculate the largest interval when the elements of an array are larger than a value?

6 次查看(过去 30 天)
Hi everyone!
i have a small questions. I have a large array whith elements with values that vary between 0 and 20. I want to determine the largest interval where the values are higher than 15. For example, if the array wass [ 0 6 5 2 16 17 16 11 12 14 5 6 9 16 17 18 18 9] then the anwer is four (16 17 18 18). Any good ideas?

回答(6 个)

Roger Stafford
Roger Stafford 2013-9-16
编辑:Andrei Bobrov 2013-9-16
Letting A be your row array:
f = find(diff([false,A>15,false])~=0);
m = max(f(2:2:end)-f(1:2:end-1));
m is the length of the longest consecutive sequence of elements greater than 15. If you want to see that sequence, do this instead:
f = find(diff([false,A>15,false])~=0);
[m,p] = max(f(2:2:end)-f(1:2:end-1));
s = A(f(2*p-1):f(2*p)-1);
s will be the longest sequence.

Image Analyst
Image Analyst 2013-9-16
If you have the Image Processing Toolbox you can simply do this:
m = [ 0 6 5 2 16 17 16 11 12 14 5 6 9 16 17 18 18 9]
m15 = m > 15
% Label the blobs
labeled = bwlabel(m15);
% Measure the lengths of stretches where it's > 15
measurements = regionprops(labeled, 'Area');
allAreas = [measurements.Area]
[sortedLengths, labels] = sort([measurements.Area], 'Descend')
largestLabelIndex = labels(1)
% Keep that one
keeper = ismember(labeled, labels(1))
% Extract the values
out = m(keeper)

Azzi Abdelmalek
Azzi Abdelmalek 2013-9-16
编辑:Azzi Abdelmalek 2013-9-16
a=[ 0 6 5 2 16 17 16 11 12 14 5 6 9 16 17 18 18 16 17 18 19 20 16 17 9];
b=a>15;
id= [0 diff(b) 0];
id1=find(id==1);
id2=find(id==-1)-1;
for k=1:numel(id1)
d=a(id1(k):id2(k));
c=[0 diff(d)>=0 0];
ii=find(c==0);
ii1=ii(1:end-1);
ii2=ii(2:end)-1;
[jj,jj]=max(ii2-ii1);
v{k}=d(ii1(jj):ii2(jj));
end
[idx,idx]=max(cellfun(@numel,v));
out=v{idx}

Kevin Claytor
Kevin Claytor 2013-9-16
We can find the sequence using find and diff;
seq = [0 6 5 2 16 17 16 11 12 14 5 6 9 16 17 18 18 9]
thresh = 15
gt = find(seq>thresh)
df = diff([0, gt])
Now we have something that looks like a bunch of ones... we can use a previous solution on answers to get the length of that sequence.
% First put it into the format of ones and zeros
x = df; x(x>1) = 0
v = diff([0, x, 0]);
len = findstr(v, -1) - findstr(v, 1);
Now, if you just want the max, it's easy; max(len)+1 (we lost one in the first diff). If you want the corresponding index... that could be trickier. I'll leave that to you.

Andrei Bobrov
Andrei Bobrov 2013-9-16
编辑:Andrei Bobrov 2013-9-16
x = [ 0 6 5 2 16 17 16 11 12 14 5 6 9 16 17 18 18 9];
xx = x(:) > 15;
t = cumsum([false;diff(xx) == 1]);
z = accumarray(t(xx),find(xx),[],@(x){x});
[~,ii] = max(cellfun('length',z));
out = x(z{ii});

Jan
Jan 2013-9-16
编辑:Jan 2013-9-16
x = [0 6 5 2 16 17 16 11 12 14 5 6 9 16 17 18 18 9];
[b, n, index] = RunLength(x > 15);
[maxN, maxPos] = max(n .* b);
Result = x(index(maxPos) + (0:maxN - 1));
Note: The current submission is incomplete, an updated one will appear tomorrow. RunLength_M is working and included in the submission also. There are many more run-length tools in the FEX, e.g. FEX: rude.

类别

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