Finding Consecutive values in array that meet specific Criteria?

11 views (last 30 days)
I have a list of values
a = [3 10 7 6 2 3 4 8]
I want to find the longest list of terms where a is greater than a certain threshold. So when a>5. These values would be [10 7 6] for the specific example and I would also like this be the output. Each value is consecutive and greater than the threshold. Although 8 is greater than the threshold, it is not consecutive. I would like to be able to do this without a looping structure if at all possible.

Accepted Answer

Matt J
Matt J on 12 Feb 2015
S=regionprops(a>5,'PIxelIdxList','Area');
[~,idx]=max([S.Area]);
longest = a(S(idx).PixelIdxList)

More Answers (2)

Azzi Abdelmalek
Azzi Abdelmalek on 12 Feb 2015
a = [3 10 7 6 2 3 4 8 4 2 7 8 9 10 1 2 7]
idx=[0 a>5 0]
ii=strfind(idx,[0 1]);
jj=strfind(idx,[1 0])-1;
[b1,b2]=max(jj-ii+1);
sequence=a(ii(b2):jj(b2))

Image Analyst
Image Analyst on 12 Feb 2015
If you have the Image Processing Toolbox, it's just basically 2 or 3 lines of code : a call to bwlabel and one call to regionprops:
% Check that user has the Image Processing Toolbox installed.
hasIPT = license('test', 'image_toolbox');
if ~hasIPT
% User does not have the toolbox installed.
message = sprintf('Sorry, but you do not seem to have the Image Processing Toolbox.\nDo you want to try to continue anyway?');
reply = questdlg(message, 'Toolbox missing', 'Yes', 'No', 'Yes');
if strcmpi(reply, 'No')
% User said No, so exit.
return;
end
end
a = [3 10 7 6 2 3 4 8]
% Threshold greater than 5 and label.
labeled = bwlabel(a > 5)
measurements = regionprops(labeled, a, 'area', 'PixelValues')
% Get all the areas (lengths of runs above threshold).
allAreas = [measurements.Area]
% Sort them in descending order
[sortedAreas, sortIndices] = sort(allAreas, 'Descend')
% Get the values of the data with the longest run (largest area).
fprintf('The values of the longest run are: ');
valuesOfLongest = measurements(sortIndices(1)).PixelValues;
fprintf('%d ', valuesOfLongest);
fprintf('\n');
In the command window, you'll see the results:
a =
3 10 7 6 2 3 4 8
labeled =
0 1 1 1 0 0 0 2
measurements =
2x1 struct array with fields:
Area
PixelValues
allAreas =
3 1
sortedAreas =
3 1
sortIndices =
1 2
The values of the longest run are: 10 7 6
If you don't follow that, let me know.

Categories

Find more on Image Data Workflows in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!