导出到 NetCDF 文件
使用高级函数和 netcdf
命名空间低级函数创建、合并和写入 netCDF 文件。
MATLAB NetCDF 功能
网络通用数据表 (netCDF) 是一组软件库及与机器无关的数据格式,支持创建、访问和共享面向数组的科学数据。NetCDF 广泛用于工程和科学领域,这些领域需要一种标准的数据存储方式,以便共享数据。
使用 MATLAB® 高级函数,将数据导出到 netCDF 文件的操作变得容易。MATLAB 低级函数提供对 NetCDF C 库中例程的访问权限。要有效地使用低级函数,您应该熟悉 netCDF C 接口。NetCDF 文档可在 Unidata 网站上获取。
注意
有关导出到常用数据格式 (CDF) 文件(这类文件具有单独的不兼容格式)的信息,请参阅Export to CDF Files。
基于现有文件或模板新建 NetCDF 文件
此示例说明如何创建一个新 NetCDF 文件,该文件包含某个现有文件的变量、维度和组定义,但使用不同的格式。
使用 nccreate
函数创建包含一个变量的文件。
nccreate('myfile.nc','myvar')
向该文件写入数据。
A = 99; ncwrite('myfile.nc','myvar',A)
使用 ncinfo
从该文件中读取变量、维度和组定义。此信息定义文件的架构。
S = ncinfo('myfile.nc');
获取文件的格式。
file_fmt = S.Format
file_fmt = 'netcdf4_classic'
将结构体 S
中 Format
字段的值更改为另一种受支持的 NetCDF 格式。
S.Format = 'netcdf4';
使用 ncwriteschema
函数,创建一个使用新格式的新文件版本。架构定义文件的结构,但不包含原始文件中的任何数据。
ncwriteschema('newfile.nc',S) S = ncinfo('newfile.nc');
注意:当您使用 ncwriteschema
转换文件格式时,如果原始文件格式包含新格式不支持的字段,您可能会收到警告消息。例如,netcdf4 格式支持填充值,但 NetCDF 经典格式不支持。在这些情况下,ncwriteschema
仍然会创建文件,但会忽略在新格式中未定义的字段。
查看新文件的格式。
new_fmt = S.Format
new_fmt = 'netcdf4'
新文件 newfile.nc
包含 myfile.nc
的变量和维度定义,但不包含数据。
将数据写入新文件。
ncwrite('newfile.nc','myvar',A)
合并两个 NetCDF 文件
此示例说明如何使用高级函数合并两个 netCDF 文件。合并后的文件包含所合并的原始文件的变量和维度定义,但不包含这些原始文件中的数据。
创建名为 ex1.nc
的 netCDF 文件,并定义名为 myvar
的变量。然后,将数据写入该变量并显示文件内容。
nccreate('ex1.nc','myvar'); ncwrite('ex1.nc','myvar',55) ncdisp('ex1.nc')
Source: pwd\ex1.nc Format: netcdf4_classic Variables: myvar Size: 1x1 Dimensions: Datatype: double
创建第二个文件并定义名为 myvar2
的变量。然后,将数据写入该变量并显示文件内容。
nccreate('ex2.nc','myvar2'); ncwrite('ex2.nc','myvar2',99) ncdisp('ex2.nc')
Source: pwd\ex2.nc Format: netcdf4_classic Variables: myvar2 Size: 1x1 Dimensions: Datatype: double
使用 ncinfo
函数获取每个文件的架构。
info1 = ncinfo('ex1.nc')
info1 = Filename: 'pwd\ex1.nc' Name: '/' Dimensions: [] Variables: [1x1 struct] Attributes: [] Groups: [] Format: 'netcdf4_classic'
info2 = ncinfo('ex2.nc')
info2 = Filename: 'pwd\ex2.nc' Name: '/' Dimensions: [] Variables: [1x1 struct] Attributes: [] Groups: [] Format: 'netcdf4_classic'
使用 ncwriteschema
函数,创建使用第一个示例文件的架构的新 netCDF 文件。然后,显示文件内容。
ncwriteschema('combined.nc',info1) ncdisp('combined.nc')
Source: pwd\combined.nc Format: netcdf4_classic Variables: myvar Size: 1x1 Dimensions: Datatype: double Attributes: _FillValue = 9.969209968386869e+36
使用 ncwriteschema
将 ex2.nc
的架构添加到 combined.nc
。
ncwriteschema('combined.nc',info2)
查看合并后的文件的内容。
ncdisp('combined.nc')
Source: pwd\combined.nc Format: netcdf4_classic Variables: myvar Size: 1x1 Dimensions: Datatype: double Attributes: _FillValue = 9.969209968386869e+36 myvar2 Size: 1x1 Dimensions: Datatype: double Attributes: _FillValue = 9.969209968386869e+36
该文件包含第一个示例文件中定义的 myvar
变量和第二个文件中定义的 myvar2
变量。
使用低级函数将数据写入 NetCDF 文件
此示例说明如何使用低级函数向 netCDF 文件写入数据。MATLAB® 低级函数提供对 netCDF C 库中例程的访问。MATLAB 将这些函数组合到一个称为 netcdf
的命名空间中。要调用该命名空间中的某个函数,必须使用命名空间名称作为该函数名称的前缀。
为了有效地使用 MATLAB netCDF 函数,您需要熟悉 netCDF C 接口的有关信息。
要运行本例,必须对当前目录拥有写入权限。
在 MATLAB 工作区中创建名为 my_data
的 1×50 数值变量。该向量属于 double
类。
my_data = linspace(0,49,50);
使用 netcdf.create
函数创建名为 my_file.nc
的 netCDF 文件。NOCLOBBER
参数是 netCDF 文件访问常量,它指示不要覆盖同名的现有文件。
ncid = netcdf.create("my_file.nc","NOCLOBBER");
netcdf.create
返回文件标识符 ncid
。创建 netCDF 文件时,文件将以定义模式打开。必须在定义模式下才能定义维度和变量。
使用 netcdf.defDim
函数在文件中定义维度。此函数对应于 netCDF 库 C API 中的 nc_def_dim
函数。在定义变量并向文件写入数据之前,您必须先在文件中定义维度。在本例中,定义名为 my_dim
、长度为 50 的维度。
dimid = netcdf.defDim(ncid,"my_dim",50);
netcdf.defDim
返回对应于新维度的维度标识符。标识符是从 0 开始的索引。
使用 netcdf.defVar
函数,在维度上定义名为 my_var
的变量。此函数对应于 netCDF 库 C API 中的 nc_def_var
函数。指定变量的 netCDF 数据类型,在本例中为 NC_BYTE
。
varid = netcdf.defVar(ncid,"my_var","NC_BYTE",dimid);
netcdf.defVar
返回对应于 my_var
的变量标识符。
使 netCDF 文件退出定义模式。要向文件写入数据,您必须处于数据模式。
netcdf.endDef(ncid)
使用 netcdf.putVar
函数,将来自 MATLAB 工作区的数据写入 netCDF 文件中的变量。工作区中的数据属于 double
类,但 netCDF 文件中的变量属于 NC_BYTE
类型。MATLAB netCDF 函数会自动进行转换。
netcdf.putVar(ncid,varid,my_data)
使用 netcdf.close
函数关闭文件。
netcdf.close(ncid)
通过打开文件并将数据从变量中读取到 MATLAB 工作区的新变量中,验证数据已写入文件。
ncid2 = netcdf.open("my_file.nc","NC_NOWRITE"); x = netcdf.getVar(ncid2,0);
查看 x
的数据类型。
whos x
Name Size Bytes Class Attributes x 50x1 50 int8
MATLAB 以列优先顺序存储数据,而 netCDF C API 使用行优先顺序。x
表示存储在 netCDF 文件中的数据,因此它是 50×1,即使在 MATLAB 工作区中的原始向量 my_data
是 1×50。由于您将数据作为 NC_BYTE
存储在 NetCDF 文件中,因此 MATLAB 将变量中的数据作为 int8
类读入工作区中。
关闭文件。
netcdf.close(ncid2)