这不完全是您所要求的,但这里有一个脚本,它将结构中的所有 {double,single,char} 变量写入 netcdf 文件。这不是最通用的代码,因为我最多只能处理 3D 变量(尽管这很容易扩展)。我在这里发布它是因为我认为它可能具有一般用途和兴趣,也许有人甚至会发布更好的版本。
我还压缩了所有非标量或字符的变量。
function struct2nc(x,ncfile,ncfiletype,deflate_lev)
% STRUCT2NC writes all float,double and character vars to netcdf
% Usage: struct2nc(x,ncfile,[ncfiletype],[deflate_lev])
% x = structure
% ncfile = name of netcdf output file (e.g. 'test.nc')
% ncfiletype = netcdf file type (e.g. 'classic','netcdf4_classic')
% deflate_lev = deflate level (0-9, 0 is none)
%
% This function writes all 'double','single' and 'char' variables
% to NetCDF using the native Matlab NetCDF interface. It skips all
% other classes in the struct (e.g. structs, cell arrays, etc). It
% also only handles scalar, 1D, 2D, and 3D arrays currently, although
% this could easily be extended.
if nargin==2,
ncfiletype='classic';
deflate_lev=0;
elseif nargin==3;
switch ncfiletype
case {'netcdf4','netcdf4_classic'}
deflate_lev=6;
otherwise
deflate_lev=0;
end
end
s = fieldnames(x);
k=0;
% create variables first, but don't write data
for i=1:length(s)
vname=char(s(i));
var=x.(vname);
vtype = class(var);
vshape = size(var);
ndims = length(vshape);
vlen = length(var(:));
switch vtype;
case {'double','single'},
if vlen==1,
nccreate(ncfile,vname,...
'Datatype',vtype,'format',ncfiletype);
k=k+1;
vnames{k}=vname;
else
if min(vshape)==1,
nccreate(ncfile,vname,...
'Datatype',vtype,...
'DeflateLevel',deflate_lev,...
'Dimensions',{[vname '1'] vlen},...
'format',ncfiletype);
k=k+1;
vnames{k}=vname;
elseif ndims==2,
nccreate(ncfile,vname,...
'Datatype',vtype,...
'DeflateLevel',deflate_lev,...
'Dimensions',{[vname '1'] vshape(1) [vname '2'] vshape(2)},...
'format',ncfiletype);
k=k+1;
vnames{k}=vname;
elseif ndims==3,
nccreate(ncfile,vname,...
'Datatype',vtype,...
'DeflateLevel',deflate_lev,...
'Dimensions',...
{[vname '1'] vshape(1) [vname '2'] vshape(2) [vname '3'] vshape(3)},...
'format',ncfiletype);
k=k+1;
vnames{k}=vname;
else,
disp('Skipping variable with more than 3 dimensions');
end
end
case {'char'},
nccreate(ncfile,vname,...
'Datatype',vtype,...
'Dimensions',{[vname '1'] vlen},.....
'format',ncfiletype);
k=k+1;
vnames{k}=vname;
otherwise,
disp(['skipping ' vname])
end
end
%write all the data at the end
for i=1:length(vnames)
ncwrite(ncfile,vnames{i},x.(vnames{i}));
end