MATLAB: How to caculate annual averge from daily data (i have just one column data for 15 years)

datasum

function [Ep,Pt,Qs] = moyenne_QEP( nomBassins,Bassins, yrMin, yrMax)
% Bassins: Structur with all Bassins
% nomBassins: Vector with bassins name
d=0;
for k =1:length(nomBassins)
try
nomBassin=char(nomBassins(k));
E = Bassins.(nomBassin).E;
P = Bassins.(nomBassin).P;
Q = Bassins.(nomBassin).QsMC;
Ep = zeros(1,16);
Pt = zeros(1,16);
Qs = zeros(10,16);
[~,C]=size(Q);
csd = 0;
sy = 1;
for yr = yrMin: yrMax
lpyr = (mod(yr,4)==0);
dpy = csd + ones(size(yr))*365+lpyr;
csd = cumsum(dpy);
sumE = 0;
sumP = 0;
for i= sy: dpy
if(length(E)> i)
sumE= sumE+ E(i);
end
if (length(P)> i)
sumP= sumP+ P(i);
end
for j=1:C
sumQ= 0;
if (length(Q)> i)
sumQ(j)= sumQ+ Q(i,j);
end
end
end
Pt(yr) = sumP/lpyr;
Ep(yr) = sumE/lpyr;
Qs(yr,:) = sumQ/lpyr;
sy = csd;
end
catch
d=d-1;
warning(char(nomBassins(k)));
end
end

Best Answer

Simpler would be to create an indexing array of calendar years and then use accumarray to compute the means by the year.
dt=datetime(yrMin:yrMax,12,31)-datetime(yrMin,1,1); % duration array of times wanted
iyr=calyears(dt)+1; % number of year duration as index 1:N
mnP=accumarray(iyr,P,[],@mean); % mean over those years for var P
Related Question