最近遇到了H5文件的读写问题,便查阅资料,但是网上结果参差不齐,于是就将本人的读写操作记录下来,水平有限仅供参考。
H5数据打印h5disp
由于我们事先不清楚H5文件中的信息,因此第一步便需要将H5的数据结果打印出来。
file='my.h5';
h5disp(file);
打印之后,将会看到H5中的group和dataset。例如,该H5文件中有两个Gropu分别是DATA和MOD,以及对应的数据集data和model。
以下是对应的两个数据
Name={'model name'};
fs=1e+3;
Simulink.defineIntEnumType('FrequencyUnits', {'Hz', 'kHz', 'MHz'},[0;1;2]);
model=struct('Name', {Name}, 'fs',fs, 'FrequencyUnits',int32(0));
data1=cell(2,1);
data1{1,1}=[1;2];
data1{2,1}=[3;4];
freq=[1: 100]';
data=struct('data',{data1}, 'freq', freq);
这两个数据集中有枚举类型和cell数组。
H5数据读取h5read
在清楚H5数据结构之后,我们就可以调用h5read读取各个dataset,即
data=h5read(filename,'Data/data/);
model=h5read(filename,'DMOD/model/);
建立H5文件H5F.create
在对H5的基本结构有了一定了解后,下面将展示如何建立一个H5文件。
H5F.create(filename, 'H5F_ACC_TRUNC','H5P_DEFAULT','H5P_DEFAULT');
函数的参数这里不做介绍,可以直接help了解。
打开建立H5文件H5F.open
fileID=H5F.open(filename, 'H5F_ACC_RDWR','H5P_DEFAULT');
建立H5文件中的Group H5G.create
H5G.create(fileID, '/MOD', 'H5P_DEFAULT', 'H5P_DEFAULT', 'H5P_DEFAULT') ;
H5G.create(fileID, '/DATA', 'H5P_DEFAULT', 'H5P_DEFAULT', 'H5P_DEFAULT');
创建数据类型H5T.create
创建数据model
info=whos("model");
compoundtype=H5T.create('H5T_COMPOUND'',info.bytes);
stringtype=H5T.create('H5T_STRING','H5T_VARIABLE');
H5T.set_size(stringtype,'H5T_VARIABLE');
parent_id =H5T.copy('H5T_NATIVE_INT');enumtype_freq = H5T.enum_create(parent_id);
H5T.enum_insert(enumtype_freq,'Hz',0);
H5T.enum_insert(enumtype_freq,'kHz',1);
H5T.enum_insert(enumtype_freq,1'MHZ',2);offset=0:
H5T.insert(compoundtype,'Name',offset,stringtype);
offset=H5T.get_size(stringtype)+offset;
H5T.insert(compoundtype,'fs',offset,'H5T_NATIVE_INT');
offset=H5T.get_size('H5T_NATIVE_INT')+offset;
H5T.insert(compoundtype,'FrequencyUnits',offset,enumtype_freq);
创建数据data
info=whos("data"“);
compoundtype1=H5T.create('H5T_COMPOUND',info.bytes);
vlentype_double=H5T.vlen_create('H5T_NATIVE_DOUBLE');offset=0:
H5T.insert(compoundtype1,'data',offset,vlentype_double);
offset=H5T.get_size(vlentype_double)+offset;
H5T.insert(compoundtype1,'freq',offset,'H5T_NATIVE_DOUBLE');
将数据集写入H5
model数据写入
attrValue='1.0':
spaceID=H5S.create_simple(1,1,1);
datasetID=H5D.create(fileID,'/MOD/model',compoundtype,spaceID,'H5P_DEFAULT');H5D.write(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',,model);
h5writeatt(filename,,'/MOD/model','Version'',attrValue);
这里需要先创建数据空间大小,然后写入数据。此外,这里还展示了属性的写入方法。
data数据写入
spaceID=H5S.create_simple(1,2,2);
datasetID1=H5D.create(fileID,'/DATA/data',compoundtype1,spaceID,'H5P_DEFAULT');H5D.write(datasetID1,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',data);
注意这里声明的空间大小和model变量不一样,因此这里设计一个2*1的cell数据写入。
关闭H5文件
H5F.close(fileID);
读写H5文件最重要的是了解几个基本结构体H5F,H5D,H5T等,以及如何构造数据类型。