Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

导出到 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'

将结构体 SFormat 字段的值更改为另一种受支持的 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

使用 ncwriteschemaex2.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)
dimid = 0

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)
varid = 0

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)

相关主题

外部网站