How to regrid the spatial data in netcdf format directly without reading it

12 次查看(过去 30 天)
I am dealing with a large size data (aprox 3 Gb) in netcdf data with 0.004 degree resolution, trying to regrid it to 0.05 degree resolution. The problem I am facing here is the size of data (Out of memory(10902x6818x846)).
Is there any way to regrid (0.004 to 0.05) this data directly without reading (ncread) in matlab and any other to deal it within matlab?
I have gone through interp3 and get idea to execute it but the size of data is curtailing me to do so.
Thank you in advance for any kind of help.
  3 个评论
Shakir Hussain
Shakir Hussain 2019-1-12
Actuall it is gridded preciptiation data in netcdf4 (nc4). I am seeking any possible way to regrid it either with slice or combinely. I prefer to slice on 3rd dimension (846).
Walter Roberson
Walter Roberson 2019-1-12
One thing I have noticed about precipation data is that it is not uncommon for there to be a bunch of missing data. Data marked as missing in netcdf files will typically show up as NaN at the MATLAB level (no matter how it is stored in netcdf.) Do you have the possibility of nan in what you read in? If you do then you need to take more care in the regridding process, as NaN often "poison" the calculations.
The default for interp2 is bilinear interpolation: the new values for any location that is not at an exact vertex is determined by interpolation from the left, right, up, down neighbours of the requested location. If one of those is NaN, then the result will be NaN. How would you like that situation handled?

请先登录,再进行评论。

采纳的回答

Walter Roberson
Walter Roberson 2019-1-12
编辑:Walter Roberson 2019-1-12
You could process one slice at a time. nc4 format is HDF5 underneath, which could be compressed, but nc4 defines that when compression is in place, the compressed data must be chunked in order to make it more efficient to access parts of it. There is the question of how the chunking is done; I suspect that probably layers are kept separate.
oldsize = [10902, 6818, 8456);
factor = 0.004/0.05;
%we read and process one slice first in order to get accurate dimensions for
%preallocating the overall data.
first_slice = ncread(filename, name_of_variable, [1 1 slice], [inf inf 1]);
newdata = imresize(firstslice, factor);
newdata(end, end, oldsize(3)) = 0; %resize to hold it all
for slice = 2 : oldsize(3)
thisslice = ncread(filename, name_of_variable, [1 1 slice], [inf inf 1]);
newslice = imresize(thisslice, factor);
newdata(:,:,slice) = newslice;
end
  5 个评论
Walter Roberson
Walter Roberson 2019-1-12
imresize is Image Processing Toolbox. An alternative:
factor = 0.004/0.05;
%we read and process one slice first in order to get accurate dimensions for
%preallocating the overall data.
first_slice = ncread(filename, name_of_variable, [1 1 1], [inf inf 1]);
oldsize = [size(first_slice), 846];
%careful about x vs y
newy = linspace(1, oldsize(1), ceil(factor * oldsize(1)));
newx = linspace(1, oldsize(2), ceil(factor * oldsize(2)));
newdata = interp2(first_slice, newx, newy);
newdata(end, end, oldsize(3)) = 0; %resize to hold it all
for slice = 2 : oldsize(3)
thisslice = ncread(filename, name_of_variable, [1 1 slice], [inf inf 1]);
newslice = interp2(thisslice, newx, newy);
newdata(:,:,slice) = newslice;
end

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Data Import and Export 的更多信息

标签

产品


版本

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by