How to save struct array into H5

36 views (last 30 days)
Kat Lee
Kat Lee on 8 Apr 2022
Answered: Shivam Lahoti on 16 Nov 2023
Hi guys
I have this simple struct array wdata, has 4 fileds and saved as struct array
FieldA =int32([1153 ; 1184 ; 1027;11 ]);
FieldB ={'Exterior (static)', 'Intake',...
'Intake manifold','test'};
FieldArray = [randn(1,ADIM0);randn(1,ADIM0);randn(1,ADIM0);randn(1,ADIM0)];
FieldC =int32([11 ; 12 ; 13; 14]);
for i = 1:DIM0
wdata(i).FieldA =FieldA(i);
wdata(i).FieldB =FieldB(i);
wdata(i).FieldArray = FieldArray(i);
wdata(i).FieldC = FieldC;
end
I want to save wdata into h5 as compound, but I got stuck with memory assigning
can anyone help?
thansk
  1 Comment
Kat Lee
Kat Lee on 8 Apr 2022
Edited: Kat Lee on 8 Apr 2022
Tried this, but failed
dim = 4;
file = H5F.create (fileName, 'H5F_ACC_TRUNC',...
'H5P_DEFAULT', 'H5P_DEFAULT');
intType =H5T.copy('H5T_NATIVE_INT');
sz(1) = H5T.get_size(intType);
strType = H5T.copy ('H5T_C_S1');
H5T.set_size (strType, 'H5T_VARIABLE');
sz(2) =H5T.get_size(strType);
% array size
base_type_id = H5T.copy('H5T_NATIVE_DOUBLE');
arrayType = H5T.array_create(base_type_id, 1, ADIM0);
type_id = H5T.copy(arrayType);
H5T.set_size(type_id, 8);
sz(3) = H5T.get_size(arrayType);
intType =H5T.copy('H5T_NATIVE_INT');
sz(4) = H5T.get_size(intType);
offset(1)=0;
offset(2:4)=cumsum(sz(1:3));
memtype = H5T.create ('H5T_COMPOUND', sum(sz));
H5T.insert (memtype,...
'FieldA',offset(1),intType);
H5T.insert (memtype,...
'FieldB',offset(2), strType);
H5T.insert (memtype,...
'FieldArray',offset(3), arrayType);
H5T.insert (memtype,...
'FieldC',offset(4), intType);
filetype = H5T.create ('H5T_COMPOUND', sum(sz));
H5T.insert (filetype, 'FieldA', offset(1),intType);
H5T.insert (filetype, 'FieldB', offset(2), strType);
H5T.insert (filetype, 'FieldArray',offset(3), arrayType);
H5T.insert (filetype, 'FieldC',offset(4), intType);
space = H5S.create_simple (1,fliplr(dims), []);
dset = H5D.create (file, DATASET, filetype, space, 'H5P_DEFAULT');
H5D.write (dset, memtype, 'H5S_ALL', 'H5S_ALL', 'H5P_DEFAULT', flip(wdata));

Sign in to comment.

Answers (1)

Shivam Lahoti
Shivam Lahoti on 16 Nov 2023
Hi Kat Lee,
I can understand that you want to save the wdata struct array into an HDF5 file as a compound datatype. However, you mentioned that you encountered issues with memory assignment.
You shall use the functions h5create’ to create the HDF5 file and define the compound datatype and ‘h5write’ to write each struct element to the HDF5 file.
Execute this command into your MATLAB window to understand the implementation of both functions with the help of an example.
openExample('matlab/WriteToEntireDataSetExample')
Refer to the documentation below for more clarity.
I hope this was helpful.
Regards,
Shivam Lahoti.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!