Finding max peak between two datetime values
조회 수: 8 (최근 30일)
이전 댓글 표시
Hi
I have a cluster of peaks that I want to make into one, but this is an issue. I have a function crossing_V7 that identifies when a peak starts (goes crosses the limit Abonnemang) and ends. Now I want a vector of the same length that has the height of every max peak in every cluster.
clear all
clc
load EFFEKT %EFFEKT contains a value for every our of the year
Abonnemang=21200;
dt = datetime(2021,1,1:1:365);
et = hours(0:23)';
t = repmat(dt,length(et),1) + repmat(et,1,length(dt));
t=t(:);
%(1:744) means I only look at January to simplify
[t0_pos1,s0_pos1,t0_neg1,s0_neg1]= crossing_V7(EFFEKT(1:744),t(1:744),Abonnemang,'linear'); % positive (pos) and negative (neg) slope crossing points
t0_pos1(10)
t0_neg1(10)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1367519/image.jpeg)
댓글 수: 0
채택된 답변
Mathieu NOE
2023년 5월 2일
hello
try this
clear all
clc
load EFFEKT %EFFEKT contains a value for every our of the year
Abonnemang=21200;
dt = datetime(2021,1,1:1:365);
et = hours(0:23)';
t = repmat(dt,length(et),1) + repmat(et,1,length(dt));
t=t(:);
%(1:744) means I only look at January to simplify
[t0_pos1,s0_pos1,t0_neg1,s0_neg1]= crossing_V7(EFFEKT(1:744),t(1:744),Abonnemang,'linear'); % positive (pos) and negative (neg) slope crossing points
t0_pos1(10)
t0_neg1(10)
% added code
for ci = 1:numel(t0_pos1)
idx = (t>=t0_pos1(ci)&t<=t0_neg1(ci));
[max_of_cluster(ci),ix] = max(EFFEKT(idx));
tmp = t(idx);
tmax(ci) = tmp(ix);
%plot
figure(ci)
ind = find(idx);
a = 2; % add some pre and post samples to better visualize the raw data curve
ind = ind(1)-a:ind(end)+a;
plot(t(ind),EFFEKT(ind),t0_pos1(ci),Abonnemang,'dr',t0_neg1(ci),Abonnemang,'dk',tmax(ci),max_of_cluster(ci),'dm');
title(['Cluster # ' num2str(ci)]);
end
댓글 수: 0
추가 답변 (1개)
Antoni Garcia-Herreros
2023년 5월 2일
Hello Joel,
You could try something like this:
clear all
clc
load EFFEKT %EFFEKT contains a value for every our of the year
Abonnemang=21200;
dt = datetime(2021,1,1:1:365);
et = hours(0:23)';
t = repmat(dt,length(et),1) + repmat(et,1,length(dt));
t=t(:);
%(1:744) means I only look at January to simplify
[t0_pos1,s0_pos1,t0_neg1,s0_neg1]= crossing_V7(EFFEKT(1:744),t(1:744),Abonnemang,'linear'); % positive (pos) and negative (neg) slope crossing points
t0_pos1(10)
t0_neg1(10)
MAXVEC=zeros(size(s0_neg1)); % Array to store the maximum values for each segment
POSMAX(size(MAXVEC,2))=datetime; % Variable to store the position of the maximum for each segment
for i=1:size(s0_neg1,2) % Loop through the segments
jmin=find(t>t0_pos1(i),1); % Find the points inside the segment
jmax=find(t>t0_neg1(i),1)-1;
tj=[t0_pos1(i);t(jmin:jmax);t0_neg1(i)]; % tj are the timepoints conforming the segment
sj=[s0_pos1(i);EFFEKT(jmin:jmax);s0_neg1(i)];% sj are the y-values conforming the segment
[MAXVEC(i),pos]=max(sj);
POSMAX(i)=tj(pos);
end
%% Plot
imax=744;
plot(t(1:imax),EFFEKT(1:imax))
hold on
plot(t(1:imax),Abonnemang*ones(1,imax))
plot(t0_pos1,s0_pos1,'r*')
plot(t0_neg1,s0_neg1,'r*')
plot(POSMAX,MAXVEC,'g*','MarkerSize',10)
ylim([0.95*Abonnemang max(EFFEKT(1:imax))])
xlim([t0_pos1(1) t0_neg1(end) ])
l=legend({'EFFEKT','Abonnemang','','','Maximum'});
l.Position = [0.37, 0.64, 0.22, 0.12];
Hope this helps!
댓글 수: 0
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!