Записать матричные данные каждому члену типа данных в файле HDF5 через MATLAB - PullRequest
3 голосов
/ 05 апреля 2019

Это моя первая попытка создать файл HDF5 с нуля с помощью команд Low-Level с помощью MATLAB.

Моя проблема в том, что мне трудно пытатьсязаписать данные для каждого конкретного члена в типе данных в моем наборе данных.

Сначала я создаю новый файл HDF5 и устанавливаю правильный слой групп:

new_h5 = H5F.create('new_hdf5_file.h5','H5F_ACC_TRUNC','H5P_DEFAULT','H5P_DEFAULT');
new_h5 = H5G.create(new_h5,'first','H5P_DEFAULT','H5P_DEFAULT','H5P_DEFAULT');
new_h5 = H5G.create(new_h5,'second','H5P_DEFAULT','H5P_DEFAULT','H5P_DEFAULT');

Затем я создаю свойтип данных:

datatype = H5T.create('H5T_compound',20);
H5T.insert(datatype,'first_element',0,'H5T_NATIVE_INT');
H5T.insert(datatype,'second_element',4,'H5T_NATIVE_DOUBLE');
H5T.insert(datatype,'third_element',12,'H5T_NATIVE_DOUBLE');

Затем я форматирую это в свой набор данных:

new_h5 = H5D.create(new_h5,'location',datatype,H5S.create('H5S_SCALAR'),'H5P_DEFAULT');
subset = H5D.get_type(H5D.open(new_h5,'/first/second/location'));
mem_type = H5T.get_member_type(subset,0);

Я получаю сообщение об ошибке с помощью следующей команды:

H5D.write(mem_type,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',data);

Обнаружена ошибка при использовании hdf5lib2

Необработанный класс HDF5 (H5T_NO_CLASS).Невозможно записать в этот атрибут или набор данных.

Итак, я пытаюсь использовать этот метод:

new_h5 = H5D.create(new_h5,'location',datatype,H5S.create_simple(2,dims,dims),'H5P_DEFAULT'); %where dims are the dimensions of all matrices of data structure
H5D.write(mem_type,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',data); %where data is a structure

Я получаю сообщение об ошибке с помощью следующей команды:

H5D.write(mem_type,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',data);

Ошибка при использовании hdf5lib2

Попытка передать слишком много значений в или из буфера библиотеки.

При поиске здесь дляXML-теги для сообщений об ошибках, он описывает вышеуказанную ошибку как «invalidArrayAccess».По-видимому, в соответствии с этим вопросом , вы можете записать только 4 члена без буфера, выдающего ошибку?

Это правильно?Как я могу правильно написать каждому участнику.Я вот-вот достигну своего ментального предела, пытаясь понять это.

РЕДАКТИРОВАТЬ :

Ссылки, хранящиеся здесь для общей информации:

Пример составных типов данных HDF5

Типы составных данных HDF5

H5D.write Команда MATLAB

1 Ответ

2 голосов
/ 09 апреля 2019

Я узнал, почему я не могу записать данные. Я решил проблему. У меня были неправильно установлены размеры (это код, который я забыл включить изначально). Мои извенения. У меня были мои размеры, как это:

dims = fliplr(size(data_matrix));

Где dims была матрица 15x250. Ошибка состояла в том, что буфер не смог записать матрицу 250x15 для каждого элемента, потому что он имел данные только для 250x1 для каждого элемента.

Следующий код будет (в общем) работать для записи данных каждому члену:

new_h5 = H5F.create('new_hdf5_file.h5','H5F_ACC_TRUNC','H5P_DEFAULT','H5P_DEFAULT');
new_h5 = H5G.create(new_h5,'first','H5P_DEFAULT','H5P_DEFAULT','H5P_DEFAULT');
new_h5 = H5G.create(new_h5,'second','H5P_DEFAULT','H5P_DEFAULT','H5P_DEFAULT');
datatype = H5T.create('H5T_compound',20);
H5T.insert(datatype,'first_element',0,'H5T_NATIVE_INT');
H5T.insert(datatype,'second_element',4,'H5T_NATIVE_DOUBLE');
H5T.insert(datatype,'third_element',12,'H5T_NATIVE_DOUBLE');
dims = fliplr(size(data_matrix)); dims = [1 dims(1,2)];
new_h5 = H5D.create(new_h5,'location',datatype,H5S.create_simple(2,dims,dims),'H5P_DEFAULT'); 
H5D.write(new_h5,'H5ML_DEFAULT','H5S_ALL','H5S_ALL','H5P_DEFAULT',data_structure);

, где data_matrix - матрица 15x250, содержащая все данные, и где data_structure - структура, содержащая 15 полей, каждое размером 250x1.

...