# Correlating values from a table using a for loop

3 views (last 30 days)
Jacqueline Chrabot on 29 Oct 2020
Answered: Peter Perkins on 20 Nov 2020
I have a table that has hourly data (t) and by day (d) of chlorophyll concentrations. I am trying to find the maximum value of Chlorophyll of the surface and bottom values for each day as well as their corresponding depths and times. Does anyone know how to do this in a for loop??? I used varfun and @max in a table set up but now moving into larger data sets, a for loop would be a better route.
T1=table(d,t,Chl_Bottom, depth_chl_bottom, Chl_Surface, depth_chl_surface);
k=0;
for i = 1:length(d)
k=k+1;
smax= find(max(Chl_Surface(i))); %find the max of Chl_Surface by day
bmax = find(max(Chl_Bottom(i))); %find the max of Chl_Bottom by day
%find the time of the day when the peak is at its max
%find the depth of the day when the peak is at its max
end
Sourabh Kondapaka on 4 Nov 2020
As this seems to be your first question, please go through this tutorial on how to ask a question.

Mathieu NOE on 2 Nov 2020
hello
hope my code can further help you - you don't need any for loop to find the max value (and the corresponding time index) of a vector.
enjoy
C = table2cell(T);
% data organized as follows : Date,time,depth_chl_bottom,Chl_Bottom,depth_chl_surface,Chl_Surface
Date = C(:,1);
time = C(:,2);
depth_chl_bottom = cell2mat(C(:,3));
Chl_Bottom = cell2mat(C(:,4));
depth_chl_surface = cell2mat(C(:,5));
Chl_Surface = cell2mat(C(:,6));
% % T1=table(d,t,Chl_Bottom, depth_chl_bottom, Chl_Surface, depth_chl_surface);
% k=0;
% for i = 1:length(Date)
% k=k+1;
% smax= find(max(Chl_Surface(i))); %find the max of Chl_Surface by day
% bmax = find(max(Chl_Bottom(i))); %find the max of Chl_Bottom by day
% %find the time of the day when the peak is at its max
% %find the depth of the day when the peak is at its max
% end
[Chl_Surface_max_value,time_index_max_Chl_Surface] = max(Chl_Surface);
[Chl_Bottom_max_value,time_index_max_Chl_Bottom] = max(Chl_Bottom);
x_axis = 1:length(Date);
figure(1),
subplot(2,1,1),plot(x_axis,Chl_Surface,'b',x_axis(time_index_max_Chl_Surface),Chl_Surface_max_value,'ro');
subplot(2,1,2),plot(x_axis,Chl_Bottom,'b',x_axis(time_index_max_Chl_Bottom),Chl_Bottom_max_value,'ro');
Sourabh Kondapaka on 4 Nov 2020
When reading the data as a table we can directly work with the table instead of converting it to a different format.
Jacqueline Chrabot had asked for a max Chl_Surface and Chl_Bottom for each day. Your code will find max of the aforementioned values for the entire dataset.

Sourabh Kondapaka on 4 Nov 2020
% As you want max values of Chl_Surface and Chl_Bottom for each day, we will need
% all the unique dates in the table first
unique_dates = unique(T.Date);
% Iterating over each unique date and finding max Chl_Surface and Chl_Bottom for that day:
for i = 1 : length(unique_dates)
%For the current unique day
fprintf("For the day %s is \n", string(unique_dates(i)));
% Extracting a part of T for the current date.
t = T(T.Date == unique_dates(i), :);
% Extracting max Chl_Surface value and the index where it occurs
[maxSurfaceValue, maxSurfaceIdx] = max(t.Chl_Surface);
% Display the max Chl_Surface value and the depth and time it occurs
disp("Max Chl_Surface is :");
disp(T(maxSurfaceIdx, :));
% Extracting max Chl_Bottom value and the index where it occurs
[maxBottomValue, maxBottomIdx] = max(t.Chl_Bottom);
% Display the max Chl_Bottom value and the depth and time it occurs
disp("Max Chl_Bottom is : ");
disp(T(maxBottomIdx, :));
end
A similar question about extracting max value in a column has been asked here
Check the documention for "max()" function here
Jacqueline Chrabot on 16 Nov 2020
So instead of using the max command is there another function that might give me the first or last peak per day. Giving me four outputs per day (two for surface chlorophyll surface and two for chlorophyll bottom)

Peter Perkins on 20 Nov 2020
Not sure why you think a "loop is better". Try this:
>> t = table([1;1;1;1;2;2;2;2;2;2],rand(10,1),rand(10,1),'VariableNames',["x" "y" "z"])
t =
10×3 table
x y z
_ ________ _______
1 0.40286 0.67573
1 0.69316 0.2173
1 0.96076 0.91596
1 0.039119 0.75431
2 0.33803 0.5145
2 0.99243 0.87343
2 0.40484 0.90224
2 0.65143 0.22551
2 0.96835 0.27113
2 0.74077 0.83571
>> rowfun(@myfun,t,'GroupingVariable','x','OutputVariableNames',["ymax" "zmax"])
ans =
2×4 table
x GroupCount ymax zmax
_ __________ _______ _______
1 4 0.98035 0.13753
2 6 0.88784 0.45141
where
function [ymax,zmax] = myfun(y,z)
[ymax,imax] = max(y);
zmax = z(imax);
end
With your real data, same thing, just more verbose because if the long names:
rowfun(@myfun,t,'GroupingVariable','Date', ...
'OutputVariableNames',["time_bottom_max" "depth_chl_bottom_max" "Chl_Bottom_max" "time_surface_max" "depth_chl_surface_max" "Chl_Surface_max"])
function [time_bottom_max,depth_chl_bottom_max,Chl_Bottom_max,time_surface_max,depth_chl_surface_max,Chl_Surface_max] = myfun(time,depth_chl_bottom,Chl_Bottom,depth_chl_surface,Chl_Surface)
[Chl_Bottom_max,imax] = max(Chl_Bottom);
time_bottom_max = time(imax);
depth_chl_bottom_max = depth_chl_bottom(imax);
[Chl_Surface_max,imax] = max(Chl_Surface);
time_surface_max = time(imax);
depth_chl_surface_max = depth_chl_surface(imax);
end