使用高级函数

  1. 在工作区中创建一个MATLAB变量
    1. testdata = uint(magic(5))
    2.使用h5create创建HDF5文件和数据集
    1. h5create('my_example_file.h5', '/dataset1', size(testdata));
    3.将数据写入到HDF5文件
    1. h5write('my_example_file.h5', '/dataset1', testdata);

    使用低级函数导出

    写入

  • 1.创建数组

    1. testdata = [1, 3, 5; 2, 4, 6];
  • 2.在系统的临时文件夹中创建一个名为my_file.h5的新的HDF5文件。

使用MATLAB H5F.create函数创建一个文件。此MATLAB函数对应于HDF5函数H5Fcreate。以参数形式,指定要指定给文件的名称、要对文件应用的访问类型(在本例中为’H5F_ACC_TRUNC’),以及其他按文件创建属性列表和文件访问属性列表指定的可选特征。在本例中,使用这些属性列表的默认值('H5P_DEFAULT')。将C常量以字符向量形式传递到MATLAB函数。

  1. filename = fullfile(tempdir,'my_file.h5');
  2. fileID = H5F.create(filename,'H5F_ACC_TRUNC','H5P_DEFAULT','H5P_DEFAULT');

其中的fileID是创建并且返回的文件标识符。

  • 3.在文件中创建用于保存 MATLAB 变量的数据集。

在 HDF5 编程模型中,您必须将数据集的数据类型和维度(数据空间)定义为单独的实体。首先,使用 H5T.copy 函数指定数据集所用的数据类型,在本例中为 double。此 MATLAB 函数对应于 HDF5 函数 H5Tcopy

  1. datatypeID = H5T.copy('H5T_NATIVE_DOUBLE');

H5T.copy 将返回数据类型标识符。

  • 4.使用 H5S.create_simple 创建一个数据空间,该函数对应于 HDF5 函数 H5Screate_simple

第一个输入 2 为数据空间的秩。第二个输入是指定数据集中每个维度的大小的数组。由于 HDF5 按照行优先的顺序存储数据,而 MATLAB 数组是按照列优先的顺序组织的,因此在使用 H5Screate_simple 之前应反转维度范围的排序,以保持数据布局。这可以使用 fliplr 来实现。

  1. dims = size(testdata);
  2. dataspaceID = H5S.create_simple(2,fliplr(dims),[]);

H5S.create_simple 会返回数据空间标识符 dataspaceID。请注意,其他使用行优先排序的软件程序(例如 HDF Group 的 H5DUMP)可能会将数据集大小报告为 3×2 而不是 2×3。

  • 5.使用 H5D.create 创建数据集,该函数对应于 HDF5 函数 H5Dcreate

以参数形式指定文件标识符、要赋给数据集的名称、数据类型标识符、数据空间标识符以及数据集创建属性列表标识符。'H5P_DEFAULT' 指定了默认属性列表设置。

  1. dsetname = 'my_dataset';
  2. datasetID = H5D.create(fileID,dsetname,datatypeID,dataspaceID,'H5P_DEFAULT');

H5D.create 会返回数据集标识符 datasetID

  • 6.使用 H5D.write 将数据写入到数据集,该函数对应于 HDF5 函数 H5Dwrite

输入参数包括数据集标识符、内存数据类型标识符、内存空间标识符、数据空间标识符、传输属性列表标识符和将写入到数据集的 MATLAB 变量的名称。常量 'H5ML_DEFAULT' 指定自动映射到 HDF5 数据类型。常量 'H5S_ALL' 告知 H5D.write 将所有数据写入到文件。

  1. H5D.write(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL',...
  2. 'H5P_DEFAULT',testdata);
  • 7.关闭数据集、数据空间、数据类型和文件对象。

如果在 MATLAB 函数内使用这些标识符,则在超出其范围时,这些标识符会自动关闭。

  1. H5D.close(datasetID);
  2. H5S.close(dataspaceID);
  3. H5T.close(datatypeID);
  4. H5F.close(fileID);

读取

打开 HDF5 文件,以便读取您所写入的数据集。使用 H5F.open 打开文件以进行只读访问。此 MATLAB 函数对应于 HDF5 函数 H5Fopen

  1. fileID = H5F.open(filename,'H5F_ACC_RDONLY','H5P_DEFAULT');

使用 H5D.open 打开要读取的数据集,此函数对应于 HDF5 函数 H5Dopen。以参数形式指定之前在示例中定义的文件标识符和数据集的名称。

  1. datasetID = H5D.open(fileID,dsetname);

使用 H5D.read 将数据读入 MATLAB 工作区,此函数对应于 HDF5 函数 H5Dread。输入参数包括数据集标识符、内存数据类型标识符、内存空间标识符、数据空间标识符和传输属性列表标识符。

  1. returned_data = H5D.read(datasetID,'H5ML_DEFAULT',...
  2. 'H5S_ALL','H5S_ALL','H5P_DEFAULT');

将原始 MATLAB 变量 testdata 与刚刚创建的变量 returned_data 进行比较。

  1. isequal(testdata,returned_data)

ans = logical 1

这两个变量是相同的。
例子:我们的HD5F文件中有两个数据集,一个名字是data,另外一个名字是label,我们将他们读入

  1. fileID = H5F.open('F:\浏览器下载\sub_0.hdf','H5F_ACC_RDONLY','H5P_DEFAULT');
  2. datasetID = H5D.open(fileID, 'data');
  3. returned_data = H5D.read(datasetID,'H5ML_DEFAULT',...
  4. 'H5S_ALL','H5S_ALL','H5P_DEFAULT'); %返回其中的data
  5. labelsetID = H5D.open(fileID, 'label');
  6. returned_label = H5D.read(labelsetID,'H5ML_DEFAULT',...
  7. 'H5S_ALL','H5S_ALL','H5P_DEFAULT'); %返回其中的label