HDF5: как прочитать массив из набора данных

Я никогда раньше этого не видел, но у меня есть файл с набором данных 1x1, где единственным значением является массив[3] 64-битной плавающей запятой. Я вижу это с помощью инструмента HDFView, но что бы я ни пытался, я получаю ошибки. Есть ли специальный тип, который мне нужно создать, чтобы это работало?

Редактировать, если я использую H5Sget_simple_extent_npoints() для получения количества точек данных, результат равен 1. Таким образом, это выглядит как 1 массив из 3 элементов.

Последнее, что я пробовал, это вручную читать 3 двойника:

hid_t dataset = ...;  // open the dataset (dataset is valid)
double var[3];
hsize_t memdim[] = { 3 };
hid_t space = H5Screate_simple(1, memdim, nullptr);  // (space is valid)
auto rc = H5Dread(dataset, H5T_NATIVE_DOUBLE, space, space, H5P_DEFAULT, &var[0]);
// rc = -1

Также попытался просто прочитать весь набор данных:

hid_t dataset = ...;  // open the dataset (dataset is valid)
double var[3];
auto rc = H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &var[0]);
// rc = -1

Текст ошибки из приведенных выше тестов:

HDF5-DIAG: Error detected in HDF5 (1.10.5) thread 17272:
  #000: \hdf5-1.10.5\src\H5Dio.c line 199 in H5Dread(): can't read data
    major: Dataset
    minor: Read failed
  #001: \hdf5-1.10.5\src\H5Dio.c line 467 in H5D__read(): unable to set up type info
    major: Dataset
    minor: Unable to initialize object
  #002: \hdf5-1.10.5\src\H5Dio.c line 983 in H5D__typeinfo_init(): unable to convert between src and dest datatype
    major: Dataset
    minor: Feature is unsupported
  #003: \hdf5-1.10.5\src\H5T.c line 4546 in H5T_path_find(): can't find datatype conversion path
    major: Datatype
    minor: Can't get value
  #004: \hdf5-1.10.5\src\H5T.c line 4762 in H5T__path_find_real(): no appropriate function for conversion path
    major: Datatype
    minor: Unable to initialize object

HDF5: как прочитать массив из набора данных

Я не программирую на C++, поэтому не могу помочь. Если вы не получили ответ на SO, спросите у умных людей на Форум группы HDF

kcw78 11.05.2022 14:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы не привязаны к конкретной библиотеке HDF5, вы можете проверить HDFql, так как это значительно облегчает вам работу с низкоуровневыми деталями HDF5.

Чтобы прочитать и отобразить набор данных одномерного массива (с именем dset) с размером 3 типа данных double (64 бита), это можно сделать следующим образом, используя HDFql в C++:

HDFql::execute("SELECT FROM dset");

while(HDFql::cursorNext() == HDFql::Success)
{
    cout << *HDFql::cursorGetBigint() << endl;
}

В качестве альтернативы, вместо использования курсора HDFql, вы можете напрямую заполнить свою переменную значениями набора данных dset следующим образом:

double values[3];

HDFql::variableRegister(&values);

HDFql::execute("SELECT FROM dset INTO MEMORY 0");

for(int i = 0; i < 3; i++)
{
    cout << values[i] << endl;
}

Спасибо за это. К сожалению, я привязан к низкоуровневой библиотеке HDF5. Это устаревшее приложение. Просто нужно это небольшое обновление для поддержки массивов внутри наборов данных.

steveo225 10.05.2022 13:30
Ответ принят как подходящий

Я понял, что есть тип массива, который можно сделать требуемым:

hsize_t size = { 3 };
hid_t type = H5Tarray_create(H5T_NATIVE_DOUBLE, 1, &size);

hid_t dataset = H5Dopen(...);
double var[3];
hsize_t memdim[] = { 1 };  // or how many arrays[3]'s to read
hid_t space = H5Screate_simple(1, memdim, nullptr);
auto rc = H5Dread(dataset, type, space, H5S_ALL, H5P_DEFAULT, &var[0]);

Другие вопросы по теме