How to find consecutive values above a certain threshold?
이전 댓글 표시
Hi.
I'm picking out values from a hourly data set, and I want to pick out values that are above 12 at least three consecutive times. Any tips on how I can do this?
example: A=[0 1 2 5 7 8 13 17 28 11 6 0 2 1 4]
I want to put the three values 13 17 28 into a vector.
Help is greatly appreciated!
- Kristine
채택된 답변
추가 답변 (4개)
Image Analyst
2015년 7월 22일
Kristine:
This pretty easy and straightforward if you have the Image Processing Toolbox to identify stretches where the numbers are above the threshold and measure their lengths. Then just save those stretches of numbers into cells of a cell array.
% Define sample data and a threshold value.
A=[0 1 2 5 7 8 13 17 28 11 6 0 2 1 4 91 49 37 79 9 100 101 3]
threshold = 12;
% Find logical vector where A > threshold
binaryVector = A > 12
% Label each region with a label - an "ID" number.
[labeledVector, numRegions] = bwlabel(binaryVector)
% Measure lengths of each region and the indexes
measurements = regionprops(labeledVector, A, 'Area', 'PixelValues');
% Find regions where the area (length) are 3 or greater and
% put the values into a cell of a cell array
for k = 1 : numRegions
if measurements(k).Area >= 3
% Area (length) is 3 or greater, so store the values.
ca{k} = measurements(k).PixelValues;
end
end
% Display the regions that meet the criteria:
celldisp(ca)
In the command window, this is what you'll see:
A =
0 1 2 5 7 8 13 17 28 11 6 0 2 1 4 91 49 37 79 9 100 101 3
binaryVector =
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0
labeledVector =
0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 2 2 2 2 0 3 3 0
numRegions =
3
ca{1} =
13 17 28
ca{2} =
91 49 37 79
댓글 수: 4
Kristine
2015년 7월 22일
Ahmad Bayhaqi
2021년 4월 6일
Hi @Image Analyst. It's good to see your script. Thank you. I also get the same condition here. But how to loop regionprops in matrix?
So I have a=76x80,60266 and b=76x80x60266. ; 76=lon, 78=lat and 60266 is time
I want to take values 'a' that are above 'b' threshold with the 5 consecutive days. However, I want to do it for my all regions. What I have done is I did several loops to follow your script.
first loop : to get labeled vector and numregions for all regions
second loop: to get the measurement value using regionprops.
binaryvector=a>b;
for i=1:1:length(lon)
for j=1:1:length(lat)
[labeledvector(i,j,:), numregions(i,j,:)]=bwlabeln(binaryvector(i,j,:));
end
end
for i=1:length(lon)
for j=1:length(lat)
measurements(i,j,:)=squeeze(regionprops(labeledvector(i,j,:),sst(i,j,:),'Area','PixelValues'));
end
end
first loop is success. However, I got stuck for using regionprops in loop?
Do you have any idea? and also how to do loop to get ca?
Thank you
Image Analyst
2021년 4월 6일
I believe it would go something like this:
mask = a > b;
for i=1:length(lon)
for j = 1:length(lat)
thisSlice = mask(i, j, :);
[labeledMatrix, numRegions] = bwlabel(thisSlice);
props = regionprops(labeledMatrix, 'Area', 'PixelValues')
% Now do something with props....
end
end
Ahmad Bayhaqi
2021년 4월 7일
편집: Ahmad Bayhaqi
2021년 4월 7일
Thank you @Image Analyst but, in my data, the threshold in every grid is also different, so the output would be different props in every location.
The code that you showed just like producing the one grid.
so, I tried this
mask = a > b;
for i=1:length(lon)
for j = 1:length(lat)
thisSlice(i,j,:) = mask(i, j, :);
[labeledMatrix(i,j,:), numRegions(i,j,:)] = bwlabeln(thisSlice(i,j,:));
props(i,j,:) = regionprops(labeledMatrix(i,j,:),a(i,j,:),'Area','PixelValues')
end
end
but, it ends up with the error in the props. It always said about dimension error.
Do you have any idea?
Thank you
Jan
2015년 7월 22일
A = [0 1 2 5 7 8 13 17 28 11 6 0 2 1 4];
[B, N] = RunLength(A > 12);
B(N < 3) = false;
mask = RunLength(B, N);
Result = A(mask);
댓글 수: 3
Kristine
2015년 7월 22일
Image Analyst
2015년 7월 22일
You'd need to download that "RunLength" function from the File Exchange using the link he gave you.
Kristine
2015년 7월 22일
Here is a conceptually very simple method (I changed the third value to 20 as well, to provide a sequence of values > 12 but shorter then three):
>> N = 12;
>> A = [0,1,20,5,7,8,13,17,28,11,6,0,2,1,4];
>> idx = [true,A(1:end-1)>N] & A>N & [A(2:end)>N,true];
>> idx = [false,idx(1:end-1)] | idx | [idx(2:end),false];
>> A(idx)
ans =
13 17 28
댓글 수: 4
Kristine
2015년 7월 22일
Kristine
2015년 7월 22일
Azzi Abdelmalek
2015년 7월 22일
Kristine, What is your question?
Kristine
2015년 7월 22일
Lane Foulks
2019년 11월 15일
편집: DGM
2023년 2월 13일
A=[0 1 2 5 7 8 13 17 28 11 6 0 2 1 4 14 18 0 2 16 15 18 13 0 ] % added a passing and failing block above threshold
Adiff = diff(A>12);
ind_start = find(Adiff==1);
ind_stop = find(Adiff==-1);
block_length = ind_stop-ind_start; % list of consecutive section lengths
blocks_ind = find(block_length>2)% list of blocks above min length
for ii = 1:numel(blocks_ind) % loops through each block
A(ind_start(blocks_ind(ii))+1:ind_stop(blocks_ind(ii)))
end
카테고리
도움말 센터 및 File Exchange에서 Pulsed Waveforms에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!