【MATLAB HDF5】Matlab将复数保存到hdf5文件

Matlab 对于hdf5文件的操作函数分为高级函数低级函数,高级函数包括h5createh5readh5writeh5disp等。在我想使用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(重要)

https://ww2.mathworks.cn/help/matlab/import_export/exporting-to-hierarchical-data-format-hdf5-files.html(重要)

https://se.mathworks.com/help/matlab/ref/datatypeh5t.html;jsessionid=ccb5ae6342170a798ef521de2314#mw_1cc58d03-1930-4334-9f16-58a886e973b7

https://ww2.mathworks.cn/matlabcentral/answers/160455-how-to-export-complex-valued-matrix-to-hdf-file#answer_157626

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值