Иерархический формат данных, версия 5, (HDF5) - универсальный, машинно-независимый стандарт хранения научных данных в файлах, разработанный Национальным центром суперкомпьютерных приложений (NCSA). HDF5 используется широким кругом инженерных и научных областей, которые хотят стандартного способа хранения данных, чтобы их можно было совместно использовать. Дополнительные сведения о формате файла HDF5 см. в документации по HDF5, доступной на веб-сайте HDF (https://www.hdfgroup.org).
MATLAB ® предоставляет два метода экспорта данных в файл HDF5:
Функции высокого уровня, упрощающие процесс экспорта данных при работе с цифровыми наборами данных
Низкоуровневые функции, обеспечивающие интерфейс MATLAB для подпрограмм в библиотеке HDF5 C
Примечание
Сведения об экспорте в файлы HDF4, имеющие отдельный и несовместимый формат, см. в разделе Экспорт в файлы HDF4.
Самый простой способ записи данных или метаданных из рабочей области MATLAB в файл HDF5 - использовать эти функции высокого уровня MATLAB.
Примечание
Высокоуровневые функции можно использовать только с числовыми данными. Для записи нечисловых данных необходимо использовать низкоуровневый интерфейс.
h5create - Создание набора данных HDF5
h5write - Запись данных в набор данных HDF5
h5writeatt - Запись данных в атрибут HDF5
Дополнительные сведения об использовании этих функций см. на справочных страницах, содержащих примеры. Следующие разделы иллюстрируют некоторые распространенные сценарии использования.
В этом примере создается массив, который затем записывается в файл HDF5.
Создайте переменную MATLAB в рабочей области. В этом примере создается массив 5 на 5 uint8 значения.
testdata = uint8(magic(5))
Создайте файл HDF5 и набор данных с помощью h5create.
h5create('my_example_file.h5', '/dataset1', size(testdata))Запишите данные в файл HDF5.
h5write('my_example_file.h5', '/dataset1', testdata)MATLAB обеспечивает прямой доступ к десяткам функций в библиотеке HDF5 с низкоуровневыми функциями, которые соответствуют функциям в библиотеке HDF5. Таким образом, можно получить доступ к функциям библиотеки HDF5 из MATLAB, таким как чтение и запись сложных типов данных и использование возможностей подзадачи HDF5.
Библиотека HDF5 организует функции библиотеки в коллекции, называемые интерфейсами. Например, все процедуры, связанные с работой с файлами, например открытие и закрытие, находятся в интерфейсе H5F, где F обозначает файл. MATLAB организует низкоуровневые функции HDF5 в классы, соответствующие каждому HDF5 интерфейсу. Например, функции MATLAB, соответствующие интерфейсу файлов HDF5 (H5F), находятся в папке класса @ H5F.
В следующих разделах содержится более подробная информация об использовании низкоуровневых функций MATLAB HDF5.
Сопоставить синтаксис функции HDF5 с синтаксисом функции MATLAB
Напишите данные набору данных HDF5 Используя функции низкого уровня MATLAB
Примечание
В этом разделе не описываются все функции библиотеки HDF5 и не описываются основные принципы программирования HDF5. Чтобы эффективно использовать низкоуровневые функции MATLAB HDF5, обратитесь к официальной HDF5 документации, доступной по адресу https://www.hdfgroup.org.
В большинстве случаев синтаксис низкоуровневых функций HDF5 MATLAB соответствует синтаксису соответствующих функций библиотеки HDF5. Например, ниже приведена сигнатура функции H5Fopen в библиотеке HDF5. В сигнатурах функций HDF5 hid_t и herr_t - это типы HDF5, возвращающие числовые значения, представляющие идентификаторы объектов или значения состояния ошибки.
hid_t H5Fopen(const char *name, unsigned flags, hid_t access_id) /* C syntax */
В MATLAB каждая функция в интерфейсе HDF5 является методом класса MATLAB. Ниже показана сигнатура соответствующей функции MATLAB. Во-первых, поскольку это метод класса, для вызова функции MATLAB необходимо использовать точечную нотацию: H5F.open. Эта функция MATLAB принимает те же три аргумента, что и функция HDF5: символьный вектор, содержащий имя, константу HDF5-defined для аргумента флагов и идентификатор списка свойств HDF5. Списки свойств используются для указания характеристик множества различных объектов HDF5. В этом случае это список свойств доступа к файлам. Обратитесь к документации по HDF5, чтобы узнать, какие константы можно использовать с определенной функцией, и обратите внимание, что в MATLAB константы передаются в виде символьных векторов.
file_id = H5F.open(name, flags, plist_id)
Однако существуют некоторые функции, в которых сигнатура функции MATLAB отличается от соответствующей функции библиотеки HDF5. Ниже описаны некоторые общие различия, которые следует учитывать при использовании низкоуровневых функций HDF5 MATLAB.
Выходные параметры HDF5 становятся возвращаемыми значениями MATLAB - Некоторые функции библиотеки HDF5 используют параметры функции для возврата данных. Поскольку функции MATLAB могут возвращать несколько значений, эти выходные параметры становятся возвращаемыми значениями. Для иллюстрации, HDF5 H5Dread функция возвращает данные в buf параметр.
herr_t H5Dread(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, void * buf ) /* C syntax */
Соответствующая функция MATLAB изменяет выходной параметр. buf в возвращаемое значение. Кроме того, в функции MATLAB ненулевое или отрицательное значение herr_t возвращаемые значения становятся ошибками MATLAB. Использование MATLAB try-catch операторов для обработки ошибок.
buf = H5D.read(dataset_id, mem_type_id, mem_space_id, file_space_id, plist_id)
Параметры длины строки не нужны - параметр длины, используемый некоторыми функциями библиотеки HDF5 для задания длины параметра строки, не является необходимым в соответствующей функции MATLAB. Например, H5Aget_name функция в библиотеке HDF5 включает в себя буфер в качестве выходного параметра и размер буфера в качестве входного параметра.
ssize_t H5Aget_name(hid_t attr_id,
size_t buf_size,
char *buf ) /* C syntax */Соответствующая функция MATLAB изменяет выходной параметр. buf в возвращаемое значение и сбрасывает buf_size параметр.
buf = H5A.get_name(attr_id)
Использовать пустой массив для задания NULL - Везде HDF5 где функции библиотеки принимают значение NULL, соответствующая функция MATLAB использует пустые массивы ([]). Например, H5Dfill функция в библиотеке HDF5 принимает значение NULL вместо указанного значения заливки.
herr_t H5Dfill(const void *fill,
hid_t fill_type_id, void *buf,
hid_t buf_type_id,
hid_t space_id ) /* C syntax */При использовании соответствующей функции MATLAB можно указать пустой массив ([]) вместо NULL.
Использование массивов ячеек для задания нескольких констант - некоторые функции в библиотеке HDF5 требуют указания массива констант. Например, в H5Screate_simple для указания того, что измерение в пространстве данных может быть неограниченным, используется константа H5S_UNLIMITED для размера в maxdims. В MATLAB, поскольку константы передаются как символьные векторы, для достижения того же результата необходимо использовать массив ячеек символьных векторов. Следующий фрагмент кода предоставляет пример использования массива ячеек символьных векторов для задания этой константы для каждой размерности этого пространства данных.
ds_id = H5S.create_simple(2,[3 4],{'H5S_UNLIMITED' 'H5S_UNLIMITED'});
Когда HDF5 низкоуровневые функции считывают данные из файла HDF5 или записывают данные в файл HDF5, эти функции автоматически сопоставляют типы данных HDF5 с типами данных MATLAB.
Для атомных типов данных, таких как обычно используемые двоичные форматы для чисел (целых чисел и символов с плавающей запятой) и символов (ASCII), отображение обычно является простым, поскольку MATLAB поддерживает аналогичные типы. Список этих сопоставлений см. в таблице Сопоставление между HDF5 атомарными типами данных и типами данных MATLAB.
Сопоставление между HDF5 атомарными типами данных и типами данных MATLAB
| HDF5 Атомарный тип данных | Тип данных MATLAB |
|---|---|
| Битовое поле | Массив упакованных 8-разрядных целых чисел |
| Плавание | MATLAB одиночного и двойного типов при условии, что они занимают 64 бита или менее |
| Целочисленные типы, подписанные и неподписанные | Эквивалентные целочисленные типы MATLAB, со знаком и без знака |
| Непрозрачный | Массив uint8 ценности |
| Ссылка | Массив uint8 ценности |
| Последовательность | Массивы символов MATLAB |
Для составных типов данных, таких как агрегации одного или нескольких атомных типов данных в структуры, многомерные массивы и типы данных переменной длины (одномерные массивы), отображение иногда неоднозначно по отношению к HDF5 типу данных. В HDF5, набор данных 5 на 5, содержащий один uint8 значение в каждом элементе отличается от набора данных 1 на 1, содержащего массив 5 на 5 uint8 значения. В первом случае набор данных содержит 25 наблюдений одного значения. Во втором случае набор данных содержит одно наблюдение с 25 значениями. В MATLAB оба этих набора данных представлены матрицей 5 на 5.
Если данные представляют собой сложный набор данных, может потребоваться создать HDF5 типы данных непосредственно, чтобы убедиться в наличии требуемого сопоставления. Список сопоставлений по умолчанию см. в таблице Сопоставление между HDF5 составными типами данных и типами данных MATLAB. Тип данных можно указать при записи данных в файл с помощью H5Dwrite функция. Дополнительные сведения см. в документации по интерфейсу типов данных HDF5.
Сопоставление между HDF5 составными типами данных и типами данных MATLAB
| HDF5 Составной тип данных | Тип данных MATLAB |
|---|---|
| Множество | Расширяет размерность типа данных, который он содержит. Например, массив целых чисел в HDF5 будет отображаться на двумерный массив целых чисел в MATLAB. |
| Комплекс | Структура MATLAB. Примечание.Все структуры, представляющие HDF5 данные в MATLAB, являются скалярными. |
| Перечисление | Массив целых чисел, каждое из которых имеет связанное имя |
| Переменная длина | Массивы ячеек MATLAB 1-D |
Низкоуровневые функции MATLAB HDF5 сообщают об измерениях наборов данных и форме наборов данных иначе, чем высокоуровневые функции MATLAB. Для простоты использования высокоуровневые функции MATLAB сообщают об измерениях набора данных, соответствующих индексированию по основным столбцам MATLAB. Чтобы быть совместимыми с библиотекой HDF5 и поддерживать возможность вложенных наборов данных и сложных типов данных, низкоуровневые функции MATLAB сообщают об измерениях массива, используя основную ориентацию строки C.
В этом примере показано, как использовать низкоуровневые функции MATLAB ® HDF5 для записи набора данных в файл HDF5 и последующего считывания набора данных из файла .
Создайте массив данных 2 на 3 для записи в файл HDF5.
testdata = [1 3 5; 2 4 6];
Создание нового файла HDF5 с именем my_file.h5 в системной папке temp. Использование MATLAB H5F.create для создания файла. Эта функция MATLAB соответствует функции HDF5, H5Fcreate. В качестве аргументов укажите имя, которое требуется назначить файлу, тип доступа к файлу ('H5F_ACC_TRUNC' в этом случае) и необязательные дополнительные характеристики, определенные списком свойств создания файла и списком свойств доступа к файлу. В этом случае используйте значения по умолчанию для этих списков свойств ('H5P_DEFAULT'). Передайте константы C функции MATLAB как векторы символов.
filename = fullfile(tempdir,'my_file.h5'); fileID = H5F.create(filename,'H5F_ACC_TRUNC','H5P_DEFAULT','H5P_DEFAULT');
H5F.create возвращает идентификатор файла, соответствующий HDF5 файлу.
Создайте набор данных в файле для хранения переменной MATLAB. В модели программирования HDF5 необходимо определить тип данных и размерность (пространство данных) набора данных как отдельных объектов. Сначала используйте H5T.copy для определения типа данных, используемого набором данных, в данном случае: double. Эта функция MATLAB соответствует функции HDF5, H5Tcopy.
datatypeID = H5T.copy('H5T_NATIVE_DOUBLE');H5T.copy возвращает идентификатор типа данных.
Создание пространства данных с помощью H5S.create_simple, что соответствует функции HDF5, H5Screate_simple. Первый вход, 2, - ранг пространства данных. Второй входной сигнал представляет собой массив, задающий размер каждого измерения набора данных. Поскольку HDF5 хранит данные в основном порядке строк, а массив MATLAB организован в основном порядке столбцов, перед использованием следует изменить порядок границ размеров на противоположный. H5Screate_simple для сохранения макета данных. Вы можете использовать fliplr с этой целью.
dims = size(testdata); dataspaceID = H5S.create_simple(2,fliplr(dims),[]);
H5S.create_simple возвращает идентификатор пространства данных, dataspaceID. Обратите внимание, что другие программные программы, использующие упорядочение строк (например, H5DUMP из группы HDF) может сообщить размер набора данных как 3 на 2 вместо 2 на 3.
Создание набора данных с помощью H5D.create, что соответствует функции HDF5, H5Dcreate. Укажите идентификатор файла, имя, которое требуется назначить набору данных, идентификатор типа данных, идентификатор пространства данных и идентификатор списка свойств создания набора данных в качестве аргументов. 'H5P_DEFAULT' задает параметры списка свойств по умолчанию.
dsetname = 'my_dataset'; datasetID = H5D.create(fileID,dsetname,datatypeID,dataspaceID,'H5P_DEFAULT');
H5D.create возвращает идентификатор набора данных, datasetID.
Запишите данные в набор данных с помощью H5D.write, что соответствует функции HDF5, H5Dwrite. Входные аргументы - идентификатор набора данных, идентификатор типа данных памяти, идентификатор места в памяти, космический идентификатор данных, имущественный идентификатор списка перемещения и название переменной MATLAB, чтобы написать набору данных. Константа, 'H5ML_DEFAULT', указывает автоматическое сопоставление с HDF5 типами данных. Константа, 'H5S_ALL', рассказывает H5D.write для записи всех данных в файл.
H5D.write(datasetID,'H5ML_DEFAULT','H5S_ALL','H5S_ALL',... 'H5P_DEFAULT',testdata);
Закройте набор данных, пространство данных, тип данных и объекты файла. При использовании внутри функции MATLAB эти идентификаторы автоматически закрываются при выходе из области действия.
H5D.close(datasetID); H5S.close(dataspaceID); H5T.close(datatypeID); H5F.close(fileID);
Откройте файл HDF5 для чтения записанного набора данных. Использовать H5F.open , чтобы открыть файл для доступа только для чтения. Эта функция MATLAB соответствует функции HDF5, H5Fopen.
fileID = H5F.open(filename,'H5F_ACC_RDONLY','H5P_DEFAULT');
Откройте набор данных для чтения с помощью H5D.open, что соответствует функции HDF5, H5Dopen. Укажите в качестве аргументов идентификатор файла и имя набора данных, определенного ранее в примере.
datasetID = H5D.open(fileID,dsetname);
Считывание данных в рабочую область MATLAB с помощью H5D.read, что соответствует функции HDF5, H5Dread. Входные аргументы - идентификатор набора данных, идентификатор типа данных памяти, идентификатор места в памяти, космический идентификатор данных и имущественный идентификатор списка перемещения.
returned_data = H5D.read(datasetID,'H5ML_DEFAULT',... 'H5S_ALL','H5S_ALL','H5P_DEFAULT');
Сравните исходную переменную MATLAB, testdata, с только что созданной переменной, returned_data.
isequal(testdata,returned_data)
ans = logical
1
Две переменные одинаковы.
Для записи большого набора данных необходимо использовать функцию порционирования библиотеки HDF5. Для этого создайте список свойств и используйте H5P.set_chunk для установки размера блока в списке свойств. Предположим, что размеры набора данных [2^16 2^16] и размер блока равен 1024 на 1024. Затем список свойств передается в качестве последнего аргумента функции создания набора данных. H5D.create, вместо использования H5P_DEFAULT значение.
dims = [2^16 2^16];
plistID = H5P.create('H5P_DATASET_CREATE'); % create property list
chunk_size = min([1024 1024], dims); % define chunk size
H5P.set_chunk(plistID, fliplr(chunk_size)); % set chunk size in property list
datasetID = H5D.create(fileID, dsetname, datatypeID, dataspaceID, plistID); При использовании любой из следующих функций, связанных с пространствами данных, следует развернуть границы размеров для сохранения правильной компоновки данных.
H5D.set_extent
H5P.get_chunk
H5P.set_chunk
H5S.create_simple
H5S.get_simple_extent_dims
H5S.select_hyperslab
H5T.array_create
H5T.get_array_dims