10

我在我的 C++ 程序中使用了一些 HDF5 文件,我对该函数有疑问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,但这不适合我的情况。

有谁知道该怎么做?

4

2 回答 2

20

为此,您需要使用以 H5 S为前缀的数据空间函数。

HDF5 参考手册是使用这些前缀组织的,因此有助于理解这一点。

如何获取数据集的维度

首先,您需要使用以下方法从数据集中获取数据空间H5Dget_space

hid_t dspace = H5Dget_space(dset);

如果您的数据空间很简单(即不是nullscalar),那么您可以使用以下方法获取维数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.

于 2013-04-03T15:15:52.703 回答
2

或者,这可以这样做(如果是简单的数据空间,请参阅 Simons 的回答,如有必要,请检查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实例的成员调用。

这些代码片段取自最新的HDF5 C++ 参考手册的示例页面(readdata.cpp) 。

编译一切,h5c++它应该工作。

于 2018-04-19T08:19:12.057 回答