获取 HDF5 数据集的维度

11

我在我的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,但它并不适用于我的情况。

有人知道如何做吗?

2个回答

21

为此,您需要使用以H5S为前缀的数据space函数。

HDF5参考手册 使用这些前缀进行组织,因此理解这一点会有所帮助。

如何获取数据集的维度

首先,您需要使用H5Dget_space从数据集中获取数据空间:

hid_t dspace = H5Dget_space(dset);

如果您的数据空间是简单的(即不为null标量),则可以使用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 中。


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++编译所有内容,应该可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接