Mercurial > forge
changeset 10485:b30f49bd551d octave-forge
(none)
author | abarth93 |
---|---|
date | Fri, 22 Jun 2012 15:20:33 +0000 |
parents | 8228f7a69801 |
children | d605b05d51d2 |
files | extra/ncArray/inst/ncCatArray.m extra/ncArray/inst/ncCatData.m extra/ncArray/inst/test_ncarray.m |
diffstat | 3 files changed, 38 insertions(+), 119 deletions(-) [+] |
line wrap: on
line diff
--- a/extra/ncArray/inst/ncCatArray.m Fri Jun 22 15:16:45 2012 +0000 +++ b/extra/ncArray/inst/ncCatArray.m Fri Jun 22 15:20:33 2012 +0000 @@ -5,7 +5,7 @@ % create a concatenated array from variables (varname) in a list of % netcdf files along dimension dim.Individual elements can be accessed by % subscribs, e.g. C(2,3) and the corrsponding subset of the appropriate file is loaded -% + % This list of netcdf files can be specified as a cell array (filenames), % shell wildcard pattern (e.g. file_*.nc) or a function handle % filenamefun. In this later case, this i-th filename is @@ -27,7 +27,9 @@ % Author: Alexander Barth (barth.alexander@gmail.com) % -function ncCA = ncCatArray(dim,pattern,varname,range) +function data = ncCatArray(dim,pattern,varname,range) + +catdimname = '_cat_dim'; if iscell(pattern) filenames = pattern; @@ -53,15 +55,43 @@ end end +if nargin == 3 + range = 1:length(filenames); +end + +var = arr(dim,filenames,varname); + +[dims,coord] = nccoord(cached_decompress(filenames{1}),varname); + +if dim > length(dims) + % concatenate is new dimension + dims{dim} = catdimname; + coord(dim).dims = {catdimname}; + coord(dim).val = range; +end + + +for i=1:length(coord) + % coordinates do also depend on the dimension only which we concatenate + coord(i).val = arr(dim,filenames,coord(i).name); + if dim > length(coord(i).dims) + coord(i).dims{dim} = catdimname; + end +end + +data = ncArray(var,dims,coord); + +end + + +function CA = arr(dim,filenames,varname) arrays = cell(1,length(filenames)); - for i=1:length(filenames) arrays{i} = ncBaseArray(filenames{i},varname); end - -ncCA = CatArray(dim,arrays); - +CA = CatArray(dim,arrays); +end % Copyright (C) 2012 Alexander Barth <barth.alexander@gmail.com> % % This program is free software; you can redistribute it and/or modify
--- a/extra/ncArray/inst/ncCatData.m Fri Jun 22 15:16:45 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ -% C = ncCatArray(dim,filenames,varname) -% C = ncCatArray(dim,pattern,varname) -% C = ncCatArray(dim,filenamefun,varname,range) -% -% create a concatenated array from variables (varname) in a list of -% netcdf files along dimension dim.Individual elements can be accessed by -% subscribs, e.g. C(2,3) and the corrsponding subset of the appropriate file is loaded - -% This list of netcdf files can be specified as a cell array (filenames), -% shell wildcard pattern (e.g. file_*.nc) or a function handle -% filenamefun. In this later case, this i-th filename is -% filenamefun(range(i)). -% -% Example: -% -% data = ncCatArray(3,{'file-20120708.nc','file-20120709.nc'},'SST') -% -% data = ncCatArray(3,'file-*.nc','SST') -% -% data = ncCatArray(3,@(t) ['file-' datestr(t,'yyyymmdd') '.nc'],... -% datenum(2012,07,08):datenum(2012,07,09)); -% -% Note: in Octave the glob function is used to determine files matching the -% shell wildcard pattern, while in Matlab rdir is used. The function rdir -% is available from Matlab exchange under BSD license -% (http://www.mathworks.com/matlabcentral/fileexchange/19550). - -% Author: Alexander Barth (barth.alexander@gmail.com) -% -function data = ncCatData(dim,pattern,varname,range) - -catdimname = '_cat_dim'; - -if iscell(pattern) - filenames = pattern; - -elseif ischar(pattern) - try - filenames = glob(pattern); - catch - try - d = rdir(pattern); - filenames = {d(:).name}; - catch - error(['The function rdir or glob (octave) is not available. '... - 'rdir can be installed from '... - 'http://www.mathworks.com/matlabcentral/fileexchange/19550']); - end - end -elseif isa(pattern, 'function_handle') - filenames = cell(1,length(range)); - - for i=1:length(range) - filenames{i} = pattern(range(i)); - end -end - -if nargin == 3 - range = 1:length(filenames); -end - -var = arr(dim,filenames,varname); - -[dims,coord] = nccoord(cached_decompress(filenames{1}),varname); - -if dim > length(dims) - % concatenate is new dimension - dims{dim} = catdimname; - coord(dim).dims = {catdimname}; - coord(dim).val = range; -end - - -for i=1:length(coord) - % coordinates do also depend on the dimension only which we concatenate - coord(i).val = arr(dim,filenames,coord(i).name); - if dim > length(coord(i).dims) - coord(i).dims{dim} = catdimname; - end -end - -data = ncArray(var,dims,coord); - -end - - -function CA = arr(dim,filenames,varname) -arrays = cell(1,length(filenames)); -for i=1:length(filenames) - arrays{i} = ncBaseArray(filenames{i},varname); -end - -CA = CatArray(dim,arrays); -end -% Copyright (C) 2012 Alexander Barth <barth.alexander@gmail.com> -% -% This program is free software; you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation; either version 2 of the License, or -% (at your option) any later version. -% -% This program is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this program; If not, see <http://www.gnu.org/licenses/>. - - -
--- a/extra/ncArray/inst/test_ncarray.m Fri Jun 22 15:16:45 2012 +0000 +++ b/extra/ncArray/inst/test_ncarray.m Fri Jun 22 15:20:33 2012 +0000 @@ -1,5 +1,5 @@ function test_ncarray() -% test ncBaseArray, ncCatArray, ncArray and ncCatData +% test ncBaseArray, ncCatArray, ncArray and ncCatArray varname = 'SST'; @@ -224,7 +224,7 @@ -CA2 = ncCatData(3,fullfile(tmpdir,'file*nc'),varname); +CA2 = ncCatArray(3,fullfile(tmpdir,'file*nc'),varname); SST_test = CA2(:,:,2); SST_ref = ncread(files{2},'SST'); assert(isequalwithequalnans(SST_test,SST_ref))