hi
I have 3D matrix with dimension (61,57,365) the 365 is daily time. I want to do a monthly average overtime to get (61,57,12). But the number of days each month is different. I would be grateful for your help

 Réponse acceptée

KALYAN ACHARJYA
KALYAN ACHARJYA le 14 Déc 2020
Modifié(e) : KALYAN ACHARJYA le 14 Déc 2020

0 votes

#One Way
m=cumsum([0,31,28,31,30,31,30,31,31,30,31,30,31]);
data=rand(61,57,365); %Sample Data
month_ave=zeros(1,12)
for i=1:12
data1=data(:,:,m(i)+1:m(i+1));
month_ave(i)=mean(data(:));
end
month_ave

7 commentaires

Walter Roberson
Walter Roberson le 14 Déc 2020
You can also construct m like above, and cumsum the data along the third dimension after padding it with leading zeros . Now index the cumsum data at the indices from the cumsum of the month lengths to get the year to date totals for the end of each month. diff() along the third dimension to get the per-month contribution. Then divide by the length of the month to get the daily mean, calculated per month.
mohamad shirgholami
mohamad shirgholami le 14 Déc 2020
Hi
But I want to answer matrix be 3d matrix :(61,57,12)
KALYAN ACHARJYA
KALYAN ACHARJYA le 14 Déc 2020
  • First Month mean data 'Single Number'
  • 2nd Month mean data 'Single Number'
  • .........
...so on you will get the array with 12 elements, with monthly mean. Can you elaborate more?
They do not want a single mean of all the data over all the locations. They want a mean for each month for each location.
output(row, col, month) = mean(data(row, col, index that covers month))
KALYAN ACHARJYA
KALYAN ACHARJYA le 14 Déc 2020
Modifié(e) : KALYAN ACHARJYA le 14 Déc 2020
Thanks, Walter sir, thanks for pointing this out. It would be great if you answer the question as a new answer. In my case it might required add 2 more loops,definitely which isn't an efficient/easiest way out.
KALYAN ACHARJYA
KALYAN ACHARJYA le 14 Déc 2020
Mohmad comments moved here
hi
What do you mean by index?
if index=[31,28,31,30,31,30,31,31,30,31,30,31] , all arrays of output matrix become zeros.
thanks.
KALYAN ACHARJYA
KALYAN ACHARJYA le 14 Déc 2020
Modifié(e) : KALYAN ACHARJYA le 14 Déc 2020
In this case it added 2 more loops,definitely which isn't an efficient/easiest way out.
m=cumsum([0,31,28,31,30,31,30,31,31,30,31,30,31]);
data=rand(61,57,365); %Sample Data
ave_data=zeros(61,57,12);
for r=1:61
for c=1:57
for d=1:12
data1=data(r,c,m(d)+1:m(d+1));
ave_data(r,c,d)=mean(data1(:));
end
end
end
ave_data

Connectez-vous pour commenter.

Plus de réponses (1)

Walter Roberson
Walter Roberson le 14 Déc 2020

1 vote

%Sample Data
data = rand(61,57,365);
data(:,:,200:250) = 0;
%the work
m = cumsum([0,31,28,31,30,31,30,31,31,30,31,30,31]);
month_ave = zeros(size(data,1), size(data,2), 12);
for month = 1 : 12
start_at = m(month)+1;
end_at = m(month+1);
month_ave(:,:,month) = mean(data(:,:,start_at:end_at), 3);
end
%show results
format long g
mat2str( reshape(month_ave(1,1,:),1,[]) )
ans = '[0.522259150104234 0.461364358148672 0.471978553723879 0.528354847707762 0.522092627671028 0.424906953694024 0.29348062051905 0 0.382149020541875 0.38378942552417 0.454583006879377 0.543602194085556]'
Yup, the zero due to the gap I wrote into the data does show up in the result.

Catégories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by