I have a set of data with each row representing a series of observations taken at a particular point. Each column represents a different observation as well as information regarding where the data was collected (longitude and latitude (column 4 and 5 respectively). The data needs to be gridded so that the data is over 2.5degrees latitude 5.0degrees longitude bin-averaged grids. How would I go about doing this?

2 Kommentare

Could you provide an example of how your data is being saved? There might be a better way of saving the data to make displaying it more straightforward. Thanks!
Natalie
Natalie am 20 Okt. 2013
The data is arranged so that each row (of which there are 14556) contains information regarding the data collected at a particular time and place, therefore the different columns contain the following information: year, month, Day of year, longitude, latitude, observation measurements Thanks

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Cedric
Cedric am 22 Okt. 2013
Bearbeitet: Cedric am 22 Okt. 2013
Assuming that longitudes are in the range [0,360[ and latitudes in the range ]-90,90[, here is part of a solution that you could fine tune. I assume that your data set is stored in numeric array data.
First, build longitude and latitude bin IDs, and an array of bin IDs matching lon/lat of columns 4/5 of your data set:
lon_binID = 1 + floor( data(:,4) ./ 5 ) ;
lat_binID = 37 + floor( data(:,5) ./ 2.5 ) ;
binID = [lon_binID, lat_binID] ;
nBin = 72 ; % # of bins per lon/lat.
For extensive data, compute the sum per bin as follows. Assume that column 3 is e.g. a mass of something..
sum_bin = accumarray( binID, data(:,3), [nBin, nBin] ) ;
Here sum_bin is a 72x72 array of sum per bin. It is slightly more complicated for intensive data, as in theory we would need a count of binned values to compute the mean (by division of sums by counts). Thankfully, ACCUMARRAY allows us to specify the accumulation function (default = @sum). Assume that column 2 of data is the temperature..
mean_bin = accumarray( binID, data(:,2), [nBin, nBin], @mean ) ;
What changed here is that we passed a handle for function MEAN to ACCUMARRAY. The @ operator returns a handle on/for the function which follows; it's a way to pass functions to other functions.
Note that ACCUMARRAY can be quite slow when used with a user defined accumulation function, or sometimes a count per bins is really needed. Here is a trick to get it: accumulating a vector of ones..
onesVector = ones( size(data,1), 1 ) ;
count_bin = accumarray( binID, onesVector, [nBin, nBin] ) ;
It would be easy to compute the mean temperature from there if we had to..
sum_bin = accumarray( binID, data(:,2), [nBin, nBin] ) ;
mean_bin = sum_bin ./ count_bin ;
Hope it helps!

2 Kommentare

Natalie
Natalie am 31 Okt. 2013
Awesome, helped a lot thank you! Sorry I didn't look at this for a while, I moved away from it.
Cedric
Cedric am 31 Okt. 2013
Great. Hopefully, it will help for your next question about lat. statistics.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Gefragt:

am 18 Okt. 2013

Kommentiert:

am 31 Okt. 2013

Community Treasure Hunt

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

Start Hunting!

Translated by