Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Creating a monthly average from a matrix

Asked by Kate on 20 Aug 2013

My data, which has 30 years of monthly data, over a 2 degree grid of the globe:

>> whos KoppenA_prate
  Name                Size                    Bytes  Class     Attributes
    KoppenA_prate      90x180x360            23328000  single        

Not every pixel has data, just the pixels that fit into Koppen classification A

>> sum(A(:))
ans =
     559

My question: Any ideas on how I could write a loop to create an average monthly value over the 30 years?

Thanks a bunch!

5 Comments

Kate on 21 Aug 2013

90x180 is a 2 degree grid of the globe, 360 is 12 months x 30 years

Kate on 21 Aug 2013

I would like to create a vector of precip data, for each month averaged over 30 years.

Kate on 21 Aug 2013

This is as far as I've gotten, but my for loop isn't working:

%Create monthly averages over 30 years
Jan=[1:12:349];
Feb=[2:12:350];
Mar=[3:12:351];
Apr=[4:12:352];
May=[5:12:353];
Jun=[6:12:354];
Jul=[7:12:355];
Aug=[8:12:356];
Sep=[9:12:357];
Oct=[10:12:358];
Nov=[11:12:359];
Dec=[12:12:360];
for ii=length(num_mons)
    if num_mons==Jan;
        Jan_dat=[Jan,KoppenA_prate(3)];
    elseif num_mons==Feb;
        Feb_dat=[Feb,KoppenA_prate(3)];
    end
end
Kate

Tags

Products

No products are associated with this question.

1 Answer

Answer by Cedric Wannaz on 21 Aug 2013
Edited by Cedric Wannaz on 21 Aug 2013
Accepted answer

Just

 avgAllYears = mean(KoppenA_prate, 3) ;

where 3 is the dimension along which the mean must be computed. With that you get a 90x180 array of means over all times.

EDIT:

 siz = size(KoppenA_prate) ;
 avg = zeros(siz(1), siz(2), 12) ;
 for mId = 1 : 12
    avg(:,:,mId) = mean(KoppenA_prate(:,:,mId:12:end), 3) ;
 end

EDIT2: or, more efficient but more complicated

 siz = size(KoppenA_prate) ;
 buf = mean(reshape(KoppenA_prate, siz(1), 12*siz(2), []), 3) ;
 avg = reshape(buf, siz(1), siz(2), []) ;

Note: both produce a 90x180x12 array of monthly averages, were e.g. avg(:,:,5) is the average of 5th months over all years.

4 Comments

Cedric Wannaz on 21 Aug 2013

Ok, I misunderstood "monthly average" for "average over monthly values". See my edits.

Kate on 21 Aug 2013

Thanks Cedric, that's great. How could I get a single, say Jan, value over the whole grid? I need to plot average yearly precip.

Thanks for all of your help!

Cedric Wannaz on 21 Aug 2013

You're welcome; see my last note.

Cedric Wannaz

Contact us