Получить размеры набора данных HDF5

Я использую некоторые файлы HDF5 в моей программе C ++, и у меня есть вопрос относительно H5Dopen функция. Можно ли получить размеры набора данных hdf5 в заданном файле?

hid_t file, dset;
herr_t status;
file = H5Fopen (filenameField, H5F_ACC_RDONLY, H5P_DEFAULT);
dset = H5Dopen (file, "/xField", H5P_DEFAULT);

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

status = H5Dread (dset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT,  &readBuf[0]);

Я только нашел H5Dget_storage_size, но это не подходит для моего случая.

Кто-нибудь знает, как это сделать?

7

Решение

Для этого вам нужно использовать данныепространство функции с префиксом H5S.

HDF5 справочное руководство организован с использованием этих префиксов, так что это помогает понять это.

Как получить размеры набора данных

Сначала вам нужно получить пространство данных из вашего набора данных, используя H5Dget_space:

hid_t dspace = H5Dget_space(dset);

Если ваше пространство данных просто (т.е. не ноль или же скаляр), то вы можете получить количество измерений, используя H5Sget_simple_extent_ndims:

const int ndims = H5Sget_simple_extent_ndims(dspace);

и размер каждого измерения, используя H5Sget_simple_extent_dims:

hsize_t dims[ndims];
H5Sget_simple_extent_dims(dspace, dims, NULL);

Размеры теперь хранятся в dims,

13

Другие решения

В качестве альтернативы, это может быть сделано следующим образом (в случае простого пространства данных, см. Ответ Саймонса и при необходимости проверьте с помощью bool H5::DataSpace::isSimple() const):

  #include "H5Cpp.h"using namespace H5;
//[...]
DataSpace dataspace(RANK, dims);
//[...]
/*
* Get the number of dimensions in the dataspace.
*/
const int rank = dataspace.getSimpleExtentNdims();

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

  /*
* Get the dimension size of each dimension in the dataspace and
* store the dimentionality in ndims.
*/
hsize_t dims_out[rank];
const int ndims = dataspace.getSimpleExtentDims( dims_out, NULL);

Функция getSimpleExtentNdims() можно назвать членом H5::DataSpace пример.

Эти части кода взяты из страница примеров (readdata.cpp) из последних HDF5 C ++ справочное руководство.

Скомпилируйте все с h5c++ и это должно работать.

1

По вопросам рекламы [email protected]