1 view (last 30 days)

I want to read the first column of the table (Times) and when time is <=100, i want to take the average of all the values of column 2(PeakAmpdB) and store that

then continue reading between >100 and <= 200 and similarly take average of all the values in couln 2 that meet that criteria. I want to do that till time <=2500.

Repeat the process for columns 3 and 4 then 5 and 6 and so on. In the end plot all these averages agains time(100-200, 200-300, ...2400-2500). Could you guys please help me?

Thank you

Cris LaPierre
on 7 Jan 2020

Edited: Cris LaPierre
on 7 Jan 2020

This sounds like something you could use groupsummary for. The challenge is to create the grouping variable. It'd be easier to play around with if we had your actual data, but I might try something like this.

% Create dummy data to test

Times = [14.61:0.1:2500]';

PeakAmpdB = linspace(85.83,1000,length(Times))';

data = table(Times,PeakAmpdB)

% Create groups for everly 100

data.Grps = ceil(Times/100);

% Compute mean of PeakAmpdB for every 100 time step

meanTbl = groupsummary(data,'Grps',"mean","PeakAmpdB")

Cris LaPierre
on 7 Jan 2020

Got it. The code I shared should do that, but requires a little tweaking to work with your data. Try this.

load my_tabletry.mat

% Identify groups of data (<=100 == 1, >100 & <=200 == 2, etc)

H1matlab_Amp.Grps = ceil(H1matlab_Amp.Times/100);

H1matlab_Amp.Grps1 = ceil(H1matlab_Amp.Times1/100);

H1matlab_Amp.Grps2 = ceil(H1matlab_Amp.Times2/100);

H1matlab_Amp.Grps3 = ceil(H1matlab_Amp.Times3/100);

H1matlab_Amp.Grps4 = ceil(H1matlab_Amp.Times4/100);

% Compute the mean PeakAmpdB# value for each group

meanTbl = groupsummary(H1matlab_Amp,'Grps',"mean","PeakAmpdB");

meanTbl1 = groupsummary(H1matlab_Amp,'Grps1',"mean","PeakAmpdB1");

meanTbl2 = groupsummary(H1matlab_Amp,'Grps2',"mean","PeakAmpdB2");

meanTbl3 = groupsummary(H1matlab_Amp,'Grps3',"mean","PeakAmpdB3");

meanTbl4 = groupsummary(H1matlab_Amp,'Grps4',"mean","PeakAmpdB4");

% Plot the resutls up to 2500 seconds (Grp == 25)

plot(meanTbl.Grps(meanTbl.Grps<=25)*100,meanTbl.mean_PeakAmpdB(meanTbl.Grps<=25))

hold on

plot(meanTbl1.Grps1(meanTbl1.Grps1<=25)*100,meanTbl1.mean_PeakAmpdB1(meanTbl1.Grps1<=25))

plot(meanTbl2.Grps2(meanTbl2.Grps2<=25)*100,meanTbl2.mean_PeakAmpdB2(meanTbl2.Grps2<=25))

plot(meanTbl3.Grps3(meanTbl3.Grps3<=25)*100,meanTbl3.mean_PeakAmpdB3(meanTbl3.Grps3<=25))

plot(meanTbl4.Grps4(meanTbl4.Grps4<=25)*100,meanTbl4.mean_PeakAmpdB4(meanTbl4.Grps4<=25))

hold off

Cris LaPierre
on 7 Jan 2020

If it makes more sense, you could also use findgroups and splitapply. Note that this approach assumes each group has groups 1 - 25.

% now with findgroups and splitapply

G0 = findgroups(ceil(H1matlab_Amp.Times/100));

G1 = findgroups(ceil(H1matlab_Amp.Times1/100));

G2 = findgroups(ceil(H1matlab_Amp.Times2/100));

G3 = findgroups(ceil(H1matlab_Amp.Times3/100));

G4 = findgroups(ceil(H1matlab_Amp.Times4/100));

% Compute the mean PeakAmpdB# value for each group

PeakAmpdB = splitapply(@mean,H1matlab_Amp.PeakAmpdB,G0);

PeakAmpdB1 = splitapply(@mean,H1matlab_Amp.PeakAmpdB1,G1);

PeakAmpdB2 = splitapply(@mean,H1matlab_Amp.PeakAmpdB2,G2);

PeakAmpdB3 = splitapply(@mean,H1matlab_Amp.PeakAmpdB3,G3);

PeakAmpdB4 = splitapply(@mean,H1matlab_Amp.PeakAmpdB4,G4);

T = [1:25]'*100;

% Plot results for first 25 groups (100 to 2500 seconds)

plot(T,PeakAmpdB(1:25),...

T,PeakAmpdB1(1:25),...

T,PeakAmpdB2(1:25),...

T,PeakAmpdB3(1:25),...

T,PeakAmpdB4(1:25))

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.