我在我的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
,但这不符合我的情况。
有谁知道怎么做?
答案 0 :(得分:14)
为此,您需要使用以H5 S 为前缀的数据空格函数。
HDF5 reference manual使用这些前缀进行组织,因此有助于理解这一点。
首先,您需要使用H5Dget_space
从数据集中获取数据空间:
hid_t dspace = H5Dget_space(dset);
如果您的数据空间简单(即不是 null 或标量),那么您可以使用{{3获取维度数量}}:
const int ndims = H5Sget_simple_extent_ndims(dspace);
以及使用H5Sget_simple_extent_ndims
的每个维度的大小:
hsize_t dims[ndims];
H5Sget_simple_extent_dims(dspace, dims, NULL);
尺寸现在存储在dims
。
答案 1 :(得分:1)
或者,这可以这样做(如果是简单的数据空间,请参阅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
实例的成员。
这些代码段取自最近examples page的HDF5 C++ reference manual(readdata.cpp)。
使用h5c++
编译所有内容,它应该可以正常工作。