使用高级函数
- 在工作区中创建一个MATLAB变量
2.使用testdata = uint(magic(5))
h5create
创建HDF5文件和数据集
3.将数据写入到HDF5文件h5create('my_example_file.h5', '/dataset1', size(testdata));
h5write('my_example_file.h5', '/dataset1', testdata);
使用低级函数导出
写入
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函数。
filename = fullfile(tempdir,'my_file.h5');
fileID = H5F.create(filename,'H5F_ACC_TRUNC','H5P_DEFAULT','H5P_DEFAULT');
其中的fileID是创建并且返回的文件标识符。
- 3.在文件中创建用于保存 MATLAB 变量的数据集。
在 HDF5 编程模型中,您必须将数据集的数据类型和维度(数据空间)定义为单独的实体。首先,使用 H5T.copy
函数指定数据集所用的数据类型,在本例中为 double
。此 MATLAB 函数对应于 HDF5 函数 H5Tcopy
。
datatypeID = H5T.copy('H5T_NATIVE_DOUBLE');
H5T.copy
将返回数据类型标识符。
- 4.使用
H5S.create_simple
创建一个数据空间,该函数对应于 HDF5 函数H5Screate_simple
。
第一个输入 2
为数据空间的秩。第二个输入是指定数据集中每个维度的大小的数组。由于 HDF5 按照行优先的顺序存储数据,而 MATLAB 数组是按照列优先的顺序组织的,因此在使用 H5Screate_simple
之前应反转维度范围的排序,以保持数据布局。这可以使用 fliplr
来实现。
dims = size(testdata);
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'
指定了默认属性列表设置。
dsetname = 'my_dataset';
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
将所有数据写入到文件。
H5D.write(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL',...
'H5P_DEFAULT',testdata);
- 7.关闭数据集、数据空间、数据类型和文件对象。
如果在 MATLAB 函数内使用这些标识符,则在超出其范围时,这些标识符会自动关闭。
H5D.close(datasetID);
H5S.close(dataspaceID);
H5T.close(datatypeID);
H5F.close(fileID);
读取
打开 HDF5 文件,以便读取您所写入的数据集。使用 H5F.open
打开文件以进行只读访问。此 MATLAB 函数对应于 HDF5 函数 H5Fopen
。
fileID = H5F.open(filename,'H5F_ACC_RDONLY','H5P_DEFAULT');
使用 H5D.open
打开要读取的数据集,此函数对应于 HDF5 函数 H5Dopen
。以参数形式指定之前在示例中定义的文件标识符和数据集的名称。
datasetID = H5D.open(fileID,dsetname);
使用 H5D.read
将数据读入 MATLAB 工作区,此函数对应于 HDF5 函数 H5Dread
。输入参数包括数据集标识符、内存数据类型标识符、内存空间标识符、数据空间标识符和传输属性列表标识符。
returned_data = H5D.read(datasetID,'H5ML_DEFAULT',...
'H5S_ALL','H5S_ALL','H5P_DEFAULT');
将原始 MATLAB 变量 testdata
与刚刚创建的变量 returned_data
进行比较。
isequal(testdata,returned_data)
ans = logical 1
这两个变量是相同的。
例子:我们的HD5F文件中有两个数据集,一个名字是data,另外一个名字是label,我们将他们读入
fileID = H5F.open('F:\浏览器下载\sub_0.hdf','H5F_ACC_RDONLY','H5P_DEFAULT');
datasetID = H5D.open(fileID, 'data');
returned_data = H5D.read(datasetID,'H5ML_DEFAULT',...
'H5S_ALL','H5S_ALL','H5P_DEFAULT'); %返回其中的data
labelsetID = H5D.open(fileID, 'label');
returned_label = H5D.read(labelsetID,'H5ML_DEFAULT',...
'H5S_ALL','H5S_ALL','H5P_DEFAULT'); %返回其中的label