
Find data between min and max
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Ahmed Alalawi
am 30 Jan. 2020
Kommentiert: Star Strider
am 30 Jan. 2020
Hello there,
I have used the two functions islocalmin and islocalmax to find minimum and maximum points in my data.
TFmin = islocalmin(task, 'MinProminence',10)
TFmax = islocalmax(task, 'MinProminence',10)
plot(time_s,task, time_s (TFmin),task(TFmin),'r*')
hold on
plot(time_s,task,time_s(TFmax),task(TFmax),'b*')
I have identified different points as you can see in the attached plots, and I ended up with 10 points.
Now, I need to create two variables (task + time_s) repressing the data that lies in between each minimum and maximum point.
For example (see attached pic):
I need extract the exact date of time and task between the points:
1 and 2
3 and 4
5 and 6
7 and 8
9 and 10
And also the opposite:
2 and 3
4 and 5
6 and 7
8 and 9
Any advice or help would be much appreciated.
Thank you
0 Kommentare
Akzeptierte Antwort
Star Strider
am 30 Jan. 2020
An accumarray call can do that relatively easily:
D = load('test.mat');
task = D.task;
time_s = D.time_s;
TFmin = islocalmin(task, 'MinProminence',10);
TFmax = islocalmax(task, 'MinProminence',10);
MinIdx = find(TFmin);
MaxIdx = find(TFmax);
Idx = sort([MinIdx; MaxIdx]);
IdxCell = accumarray(Idx(1:numel(Idx)-1), (1:numel(Idx)-1).', [], @(x){Idx(x):Idx(x+1)}); % Cell Array Of Index Ranges
IdxRng = find(cellfun(@(x)~isempty(x), IdxCell)); % Index Ranges
GetData = @(x) [time_s(IdxCell{IdxRng(x)}), task(IdxCell{IdxRng(x)})]; % Function To Retrieve Data Easily
Get1 = GetData(1); % Get First Set
X1 = Get1(:,1);
Y1 = Get1(:,2);
Get3 = GetData(3); % Get Third Set
X3 = Get3(:,1);
Y3 = Get3(:,2);
figure
plot(time_s,task, time_s (TFmin),task(TFmin),'r*')
hold on
plot(time_s,task,time_s(TFmax),task(TFmax),'b*')
plot(X1, Y1, '.r') % Plot First Set
plot(X3, Y3, '.g') % Plot Third Set
hold off
Producing this example plot:

Thius code recovers all of the intervals, not only the ascending ones, so choose the odd-numbered arguments to ‘GetData’.
2 Kommentare
Weitere Antworten (1)
Jeremy
am 30 Jan. 2020
Something like this?
t = linspace(0,2*pi,201);
y = sin(t);
plot(t,y,'LineWidth',2)
grid on
hold on
minid = find(islocalmin(y));
maxid = find(islocalmax(y));
[~,d] = min([minid maxid])
switch d
case 1
data_id = minid:1:maxid;
case 2
data_id = maxid:1:minid;
end
t_int = t(data_id);
y_int = y(data_id);
plot(t_int,y_int,'r--','LineWidth',2)
0 Kommentare
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!