Matlab 对于hdf5文件的操作函数分为高级函数和低级函数,高级函数包括h5create
、h5read
、h5write
、h5disp
等。在我想使用h5create
保存复数数据时,我发现,数据类型参数中没有对应的复数类型。
% 语法
% h5create(filename,ds,sz)
% h5create(filename,ds,sz,Name,Value)
查阅资料后发现如果要保存复数数据,必须用更低级的函数才可以。
Example
将一个复数数据
complex_data
保存到data.h5
文件中,其中复数的实部和虚部是float32类型数据。
clear;clc;
%% 建立复数数据类型
% 定义复数实部、虚部这两个member的数据类型
dtype(1) = H5T.copy('H5T_IEEE_F32LE');
dtype(2) = H5T.copy('H5T_IEEE_F32LE');
% 获取对应数据的字节数
type_size(1,1) = H5T.get_size(dtype(1));
type_size(2,1) = H5T.get_size(dtype(2));
% 根据字节数生成数据偏移量,第一个一般都设为0,假设有两个以上的member,
% 则最后一个的偏移量无关紧要,中间的偏移量需要累加,用cumsum函数
offset(1) = 0;
offset(2) = type_size(1);
% 创建复合数据类型
file_type = H5T.create('H5T_COMPOUND',sum(type_size));
% 插入对应的member
H5T.insert(file_type,'r', offset(1), dtype(1));
H5T.insert(file_type,'i', offset(2), dtype(1));
%% 将复数数据保存到.h5文件中
% 将复数数据转为结构体数据类型(后面保存符合h5的复数数据必须用结构体数据)
new_complex_data.r = real(complex_data);
new_complex_data.i = imag(complex_data);
% 创建.h5文件
fileID = H5F.create('data.h5','H5F_ACC_TRUNC','H5P_DEFAULT','H5P_DEFAULT');
% 使用之前的复合数据类型
datatypeID = H5T.copy(file_type);
% 定义数据大小,主要需要把size结果翻转一下
dataspaceID = H5S.create_simple(2,fliplr(size(complex_data)),[]);
% 定义h5数据集名称
dsetname = 'complex_data';
% 创建数据集
datasetID = H5D.create(fileID,dsetname,datatypeID,dataspaceID,'H5P_DEFAULT');
% 写入数据
H5D.write(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',new_complex_data);
参考资料
https://ww2.mathworks.cn/help/releases/R2021a/matlab/ref/h5ml.hoffset.html?s_tid=doc_ta(重要)