Иерархический Формат данных, Версия 5, (HDF5) является машинно-независимым стандартом общего назначения для того, чтобы хранить научные данные в файлах, разработанных Национальным центром суперкомпьютерных приложений (NCSA). HDF5 используется широким спектром технических и научных полей, которые хотят стандартный способ хранить данные так, чтобы он мог быть совместно использован. Для получения дополнительной информации о формате файла HDF5, считайте документацию HDF5, доступную на веб-сайте HDF (https://www.hdfgroup.org
).
MATLAB® предоставляет два метода, чтобы экспортировать данные в файл HDF5:
Высокоуровневые функции, которые упрощают процесс экспортирования данных при работе с числовыми наборами данных
Низкоуровневые функции, которые предоставляют интерфейс MATLAB стандартным программам в библиотеке HDF5 C
Для получения информации об экспорте в файлы HDF4, которые имеют отдельный и несовместимый формат, смотрите Экспорт в Файлы HDF4.
Самый легкий способ записать данные или метаданные от MATLAB workspace до файла 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 или объясняет основные концепции программирования 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-заданную константу для аргумента флагов и ID списка свойств 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 поддерживает подобные типы. См. таблицу Mapping Between HDF5 Atomic Data Types и MATLAB Data Types для списка этих отображений.
Отображение между атомарными типами данных 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 непосредственно, чтобы убедиться, что у вас есть отображение, вы предназначаете. См. таблицу Mapping Between HDF5 Composite Data Types и MATLAB Data Types для списка отображений по умолчанию. Можно задать тип данных, когда вы записываете данные к файлу с помощью функции H5Dwrite
. Смотрите, что тип данных HDF5 соединяет интерфейсом с документацией для получения дополнительной информации.
Отображение между типами данных составного объекта HDF5 и типами данных MATLAB
Тип данных составного объекта HDF5 | Тип данных MATLAB |
---|---|
Массив | Расширяет размерность типа данных, который она содержит. Например, массив целых чисел в HDF5 сопоставил бы на двумерную матрицу целых чисел в MATLAB. |
Составной объект | Структура MATLAB. Примечание: Все структуры, представляющие данные HDF5 в MATLAB, являются скаляром. |
Перечисление | Массив целых чисел, которые у каждого есть связанное имя |
Переменная длина | MATLAB 1D массивы ячеек |
Низкоуровневые HDF5 функции MATLAB сообщают о размерностях набора данных и форме наборов данных по-другому, чем высокоуровневые функции MATLAB. Для простоты использования высокоуровневые функции MATLAB сообщают о размерностях набора данных, сопоставимых с MATLAB главная столбцом индексация. Чтобы быть сопоставимыми с библиотекой HDF5 и поддержать возможность вложенных наборов данных и сложных типов данных, низкоуровневые функции MATLAB сообщают об измерениях массива с помощью главной строкой ориентации C.
Этот пример показывает, как использовать низкоуровневые функции MATLAB® HDF5, чтобы записать набор данных в файл HDF5 и затем считать набор данных из файла.
Создайте массив 2х3 данных, чтобы записать в файл HDF5.
testdata = [1 3 5; 2 4 6];
Создайте новый файл с именем HDF5 my_file.h5
в системной папке временного файла. Используйте функцию H5F.create
MATLAB, чтобы создать файл. Эта функция 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 Group) могут сообщить, что размер набора данных 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 workspace с помощью 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