主要内容

导入 HDF5 文件

您可以通过多种方式从 HDF5 文件读取数据。您可以通过编程方式使用 MATLAB® 高级 HDF5 函数或低级函数的 HDF5 库命名空间。您可以通过交互方式使用导入数据实时编辑器任务或(在 MATLAB Online™ 中)导入工具

分层数据格式版本 5 (HDF5) 是由美国国家超级计算应用中心 (NCSA) 开发的用于存储文件中科学数据的通用型机器无关标准。HDF5 广泛用于工程和科学领域,这些领域需要一种标准的数据存储方式,以便共享数据。有关 HDF5 文件格式的详细信息,请阅读 HDF Group 网站 (https://www.hdfgroup.org) 上提供的 HDF5 文档。

注意

有关导入具有单独的不兼容格式的 HDF4 文件的信息,请参阅使用高级函数导入 HDF4 文件

使用高级 HDF5 函数导入数据

MATLAB 包含几个函数,可用于检查 HDF5 文件的内容,并将文件中的数据导入 MATLAB 工作区中。

  • h5disp - 查看 HDF5 文件的内容。

  • h5info - 创建包含定义 HDF5 文件的所有元数据的结构体。

  • h5read - 从 HDF5 文件中的数据集读取数据。

  • h5readatt - 从与 HDF5 文件中的数据集或文件本身相关联的属性(全局属性)读取数据。

有关如何使用这些函数的详细信息,请参阅其参考页,其中包括示例。以下各节说明一些常见的使用情形。

确定 HDF5 文件的内容

HDF5 文件可以包含数据和元数据,称为属性。HDF5 文件以类似于 UNIX® 文件系统的层次结构方式来组织数据和元数据。

在 HDF5 文件中,层次结构中的目录称为。组可以包含其他组、数据集、属性、链接和数据类型。数据集是数据的集合,例如多维数值数组或字符串。属性是与另一实体(例如数据集)相关联的任何数据。链接类似于 UNIX 文件系统符号链接。链接是引用对象而不必制作对象副本的一种方法。

数据类型是对数据集或属性中数据的描述。数据类型说明如何解释数据集中的数据。

要快速查看 HDF5 文件的内容,请使用 h5disp 函数。

h5disp("example.h5")
HDF5 example.h5 
Group '/' 
    Attributes:
        'attr1':  97 98 99 100 101 102 103 104 105 0 
        'attr2':  2x2 H5T_INTEGER
    Group '/g1' 
        Group '/g1/g1.1' 
            Dataset 'dset1.1.1' 
                Size:  10x10
                MaxSize:  10x10
                Datatype:   H5T_STD_I32BE (int32)
                ChunkSize:  []
                Filters:  none
                Attributes:
                    'attr1':  49 115 116 32 97 116 116 114 105 ...
                    'attr2':  50 110 100 32 97 116 116 114 105 ...
            Dataset 'dset1.1.2' 
                Size:  20
                MaxSize:  20
                Datatype:   H5T_STD_I32BE (int32)
                ChunkSize:  []
                Filters:  none
        Group '/g1/g1.2' 
            Group '/g1/g1.2/g1.2.1' 
                Link:  'slink'
                    Type:  'soft link'
                    Target:  'somevalue'
    Group '/g2' 
        Dataset 'dset2.1' 
            Size:  10
            MaxSize:  10
            Datatype:   H5T_IEEE_F32BE (single)
            ChunkSize:  []
            Filters:  none
        Dataset 'dset2.2' 
            Size:  5x3
            MaxSize:  5x3
            Datatype:   H5T_IEEE_F32BE (single)
            ChunkSize:  []
            Filters:  none
					.
					.
					.

要探查 HDF5 文件的层次结构组织方式,请使用 h5info 函数。h5info 函数返回包含有关 HDF5 文件的各种信息的结构体,包括文件名称。

info = h5info("example.h5")
info = 

  struct with fields:

      Filename: 'matlabroot\matlab\toolbox\matlab\demos\example.h5'
          Name: '/'
        Groups: [4×1 struct]
      Datasets: []
     Datatypes: []
         Links: []
    Attributes: [2×1 struct]

通过查看 GroupsAttributes 字段,您可以看到该文件包含四个组和两个属性。DatasetsDatatypesLinks 字段都为空,表示根组不包含任何数据集、数据类型或链接。要进一步了解示例 HDF5 文件的内容,请检查 Groups 中的一个结构体。以下示例显示了此字段中第二个结构体的内容。

level2 = info.Groups(2)
level2 = 

  struct with fields:

          Name: '/g2'
        Groups: []
      Datasets: [2×1 struct]
     Datatypes: []
         Links: []
    Attributes: []

在示例文件中,名为 /g2 的组包含两个数据集。此图说明了示例 HDF5 文件组织结构的这一部分。

Schematic showing structure of HDF5 data in example.h5

要获取有关数据集的信息(例如其名称、维度和数据类型),请查看 Datasets 字段中返回的结构体之一。

dataset1 = level2.Datasets(1)
dataset1 = 

  struct with fields:

          Name: 'dset2.1'
      Datatype: [1×1 struct]
     Dataspace: [1×1 struct]
     ChunkSize: []
     FillValue: []
       Filters: []
    Attributes: []

从 HDF5 文件导入数据

要从 HDF5 文件读取数据或元数据,请使用 h5read 函数。指定 HDF5 文件的名称和数据集的名称作为参量。(要读取属性的值,必须使用 h5readatt。)

为了进行说明,此示例从 HDF5 示例文件 /g2/dset2.1 读取数据集 example.h5

data = h5read("example.h5","/g2/dset2.1")
data =

  10×1 single column vector

    1.0000
    1.1000
    1.2000
    1.3000
    1.4000
    1.5000
    1.6000
    1.7000
    1.8000
    1.9000

将 HDF5 数据类型映射到 MATLAB 数据类型

h5read 函数将数据从 HDF5 文件读入 MATLAB 工作区时,它会将 HDF5 数据类型映射到 MATLAB 数据类型,如下表所示。

HDF5 数据类型h5read 输出

位字段

包含 8 位整数的数组

浮点数

MATLAB singledouble 类型,前提是它们占用 64 位或更少

整数类型,有符号和无符号

等效的 MATLAB 整数类型,有符号和无符号

不透明

uint8 值的元胞数组

引用

引用指向的实际数据的元胞数组,而不是引用的值

字符串,固定长度和可变长度

字符串数组

枚举

字符向量元胞数组,其中每个枚举值由对应的成员名称替换

复合

1×1 结构体数组;数据集的维度在结构体的字段中表示

数组

由数据类型与 HDF5 数组相同的值构成的数组。例如,如果数组由有符号 32 位整数构成,则 MATLAB 数组的类型为 int32

MATLAB 随附的示例 HDF5 文件包含所有这些数据类型的示例。

例如,数据集 /g3/string 是字符串。

h5disp("example.h5","/g3/string")
HDF5 example.h5 
Dataset 'string' 
    Size:  2
    MaxSize:  2
    Datatype:   H5T_STRING
        String Length: 3
        Padding: H5T_STR_NULLTERM
        Character Set: H5T_CSET_ASCII
        Character Type: H5T_C_S1
    ChunkSize:  []
    Filters:  none
    FillValue:  '   '

现在从文件读取数据。MATLAB 将其以字符串数组形式返回。

s = h5read("example.h5","/g3/string")
s = 

  2×1 string array

    "ab "
    "de "

复合数据类型始终以结构体形式返回。数据集的维度在结构体的字段中表示。例如,数据集 /g3/compound2D 是复合数据类型。

h5disp("example.h5","/g3/compound2D")
HDF5 example.h5 
Dataset 'compound2D' 
    Size:  2x3
    MaxSize:  2x3
    Datatype:   H5T_COMPOUND
        Member 'a':  H5T_STD_I8LE (int8)
        Member 'b':  H5T_IEEE_F64LE (double)
    ChunkSize:  []
    Filters:  none
    FillValue:  H5T_COMPOUND

现在从文件读取数据。MATLAB 将其以结构体形式返回。

data = h5read("example.h5","/g3/compound2D")
data = 

  struct with fields:

    a: [2×3 int8]
    b: [2×3 double]

使用低级 HDF5 函数导入数据

MATLAB 支持通过低级函数直接访问 HDF5 库中的数十个函数,这些低级函数对应于 HDF5 库中的函数。通过这种方式,您就可以从 MATLAB 访问 HDF5 库的功能,例如使用 HDF5 子集功能和编写复数数据类型。有关详细信息,请参阅Export Data Using MATLAB Low-Level HDF5 Functions

以交互方式从 HDF5 文件读取数据

此示例说明如何使用导入数据任务来浏览 HDF5 文件的结构,从文件中导入数据,然后分析和可视化数据。

浏览和导入数据

此示例附带的 HDF5 文件包含来自 NASA Precipitation Processing System (PPS) 的一系列降水概率估计值。

通过选择实时编辑器选项卡上的任务 > 导入数据,在实时编辑器中打开导入数据任务。在文件字段中输入 HDF5 文件的名称 nasa_pps.h5。使用任务浏览数据的结构,包括组、数据集和属性。该文件包含组 S1,其中包含三个数据集。probabilityOfPrecip 数据集包含给定位置的降水概率估计值;LatitudeLongitude 数据集包含这些概率估计值的位置。probabilityOfPrecip 数据集的属性包括 units,其值为 'percent'

选择并导入三个数据集的数据和属性。

2023-12-07_09-19-16.png

要查看此任务生成的代码,请点击任务参数区域底部的显示代码展开任务显示。

% Create a structure to store imported HDF5 data
nasa_pps = struct();

filename = "nasa_pps.h5";

nasa_pps.Groups(1).Name = "S1";

nasa_pps.Groups(1).Datasets(1).Name = "Latitude";
nasa_pps.Groups(1).Datasets(1).Value = h5read(filename, "/S1/Latitude");

nasa_pps.Groups(1).Datasets(2).Name = "Longitude";
nasa_pps.Groups(1).Datasets(2).Value = h5read(filename, "/S1/Longitude");

nasa_pps.Groups(1).Datasets(3).Name = "probabilityOfPrecip";
nasa_pps.Groups(1).Datasets(3).Value = h5read(filename, "/S1/probabilityOfPrecip");

nasa_pps.Groups(1).Datasets(1).Attributes(1).Name = "units";
nasa_pps.Groups(1).Datasets(1).Attributes(1).Value = h5readatt(filename, "/S1/Latitude", "units");

nasa_pps.Groups(1).Datasets(1).Attributes(2).Name = "DimensionNames";
nasa_pps.Groups(1).Datasets(1).Attributes(2).Value = h5readatt(filename, "/S1/Latitude", "DimensionNames");

nasa_pps.Groups(1).Datasets(1).Attributes(3).Name = "Units";
nasa_pps.Groups(1).Datasets(1).Attributes(3).Value = h5readatt(filename, "/S1/Latitude", "Units");

nasa_pps.Groups(1).Datasets(1).Attributes(4).Name = "_FillValue";
nasa_pps.Groups(1).Datasets(1).Attributes(4).Value = h5readatt(filename, "/S1/Latitude", "_FillValue");

nasa_pps.Groups(1).Datasets(1).Attributes(5).Name = "CodeMissingValue";
nasa_pps.Groups(1).Datasets(1).Attributes(5).Value = h5readatt(filename, "/S1/Latitude", "CodeMissingValue");

nasa_pps.Groups(1).Datasets(2).Attributes(1).Name = "units";
nasa_pps.Groups(1).Datasets(2).Attributes(1).Value = h5readatt(filename, "/S1/Longitude", "units");

nasa_pps.Groups(1).Datasets(2).Attributes(2).Name = "DimensionNames";
nasa_pps.Groups(1).Datasets(2).Attributes(2).Value = h5readatt(filename, "/S1/Longitude", "DimensionNames");

nasa_pps.Groups(1).Datasets(2).Attributes(3).Name = "Units";
nasa_pps.Groups(1).Datasets(2).Attributes(3).Value = h5readatt(filename, "/S1/Longitude", "Units");

nasa_pps.Groups(1).Datasets(2).Attributes(4).Name = "_FillValue";
nasa_pps.Groups(1).Datasets(2).Attributes(4).Value = h5readatt(filename, "/S1/Longitude", "_FillValue");

nasa_pps.Groups(1).Datasets(2).Attributes(5).Name = "CodeMissingValue";
nasa_pps.Groups(1).Datasets(2).Attributes(5).Value = h5readatt(filename, "/S1/Longitude", "CodeMissingValue");

nasa_pps.Groups(1).Datasets(3).Attributes(1).Name = "units";
nasa_pps.Groups(1).Datasets(3).Attributes(1).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "units");

nasa_pps.Groups(1).Datasets(3).Attributes(2).Name = "_FillValue";
nasa_pps.Groups(1).Datasets(3).Attributes(2).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "_FillValue");

nasa_pps.Groups(1).Datasets(3).Attributes(3).Name = "DimensionNames";
nasa_pps.Groups(1).Datasets(3).Attributes(3).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "DimensionNames");

nasa_pps.Groups(1).Datasets(3).Attributes(4).Name = "CodeMissingValue";
nasa_pps.Groups(1).Datasets(3).Attributes(4).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "CodeMissingValue");

nasa_pps.Groups(1).Datasets(3).Attributes(5).Name = "Units";
nasa_pps.Groups(1).Datasets(3).Attributes(5).Value = h5readatt(filename, "/S1/probabilityOfPrecip", "Units");

clear filename

组织和准备数据

使用冒号运算符 (:) 将三个数据集的数据提取为列向量。

lats = nasa_pps.Groups.Datasets(1).Value(:);
lons = nasa_pps.Groups.Datasets(2).Value(:);
probs = nasa_pps.Groups.Datasets(3).Value(:);

清理数据以备绘图。这三个数据集中的有效索引符合以下条件:

  • probs 中的值在区间 [0, 100] 内。

  • lats 中的值在区间 [–90, 90] 内。

  • lons 中的值在区间 [–180, 180] 内。

通过使用逻辑索引,仅保留三个数据集中有效索引处的值。此步骤删除无效的经度和纬度值以及概率估计值的无效百分比值。

isValid = 0<=probs & probs<=100 & abs(lats)<=90 & abs(lons)<=180;

probs = probs(isValid);
lats = lats(isValid);
lons = lons(isValid);

对数据绘图

为数据集中的有效数据创建一个地理密度图。“较暖”的颜色表示较高的降水概率。

g = geodensityplot(lats,lons,probs,FaceColor="interp");
geobasemap grayland
geolimits([-80 80],[-180 -90])
title("Probability of Precipitation vs. Location")
colormap turbo

Figure contains an axes object with type geoaxes. The geoaxes object contains an object of type densityplot.

感谢

全球降水数据由 NASA Precipitation Processing System 提供,来自其网站 https://gpm.nasa.gov/data/directory

使用动态加载的过滤器读取 HDF5 数据集

MATLAB 支持使用动态加载的过滤器读写 HDF5 数据集。HDF Group 在其网站的过滤器部分维护已注册过滤器的列表。

要读取使用用户定义的第三方过滤器写入的数据集,请按照以下步骤操作:

  1. 在您的系统上将 HDF5 过滤器插件安装为共享库或 DLL。

  2. 设置 HDF5_PLUGIN_PATH 环境变量以指向插件的本地安装,然后启动 MATLAB:

    • 在 Windows® 上 - 使用系统属性 > 高级 > 环境变量设置环境变量,然后启动 MATLAB。

    • 在 Linux®Mac 上 - 从终端设置环境变量,然后从同一终端启动 MATLAB。

在完成这些步骤后,您可以使用高级或低级 MATLAB HDF5 函数来读取和访问已使用第三方过滤器压缩的数据集。有关详细信息,请参阅 HDF Group 网站上的 HDF5 动态加载的过滤器

仅限 Linux 用户:使用 MATLAB HDF5 共享库重新编译过滤器插件

从 R2021b 开始,在某些情况下,使用需要回调核心 HDF5 库函数的过滤器插件的 Linux 用户必须使用附带的 MATLAB HDF5 共享库 /matlab/bin/glnxa64/libhdf5.so.x.x.x 重新编译插件。如果您不使用此版本的共享库重新编译插件,则可能会遇到各种问题,包括未定义的行为,甚至可能导致系统崩溃。有关详细信息,请参阅使用 MATLAB HDF5 共享库或 GNU 导出映射在 Linux 上编译 HDF5 过滤器插件

另请参阅

主题