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

2 Ansichten (letzte 30 Tage)
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?

Antworten (6)

Roger Stafford
Roger Stafford am 16 Sep. 2013
Bearbeitet: Andrei Bobrov am 16 Sep. 2013
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 am 16 Sep. 2013
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 am 16 Sep. 2013
Bearbeitet: Azzi Abdelmalek am 16 Sep. 2013
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 am 16 Sep. 2013
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 am 16 Sep. 2013
Bearbeitet: Andrei Bobrov am 16 Sep. 2013
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 am 16 Sep. 2013
Bearbeitet: Jan am 16 Sep. 2013
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.

Kategorien

Mehr zu Linear Algebra finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by