如何使用 C++ API 在 HDF5 文件中创建多值属性

2023-12-23

编辑开始

我正在尝试基于本机类型(float、int...)创建“对、三元组或 n-uplet”属性:

  • 浮点对、浮点三元组、浮点属性的 n 元组
  • int 对、int 三元组、int 属性的 n 元组

我不想创建“数组”属性,也不想创建“复合”属性

EDIT END

我正在尝试创建一个基于本机类型(float、int...)的属性,但其中包含 2,3 个或更多值(相当于一对或一个 n-uplet)。

我不想创建数组!我想创建与数组非常相似但又不一样的东西

我可以通过这种方式创建单值属性(对于“双”属性):

H5::DataSpace dataSpace = H5::DataSpace();
H5::Attribute attribute = group.createAttribute(attributeName, H5::PredType::IEEE_F64LE, dataSpace);
attribute.write(H5::PredType::IEEE_F64LE, &attributeValue);

为了创建几个“双”,我尝试过:

hsize_t dimension;
dimension = 2;
H5::ArrayType dataType(H5::PredType::IEEE_F64LE, 1, &dimension);

H5::DataSpace dataSpace = H5::DataSpace();
H5::Attribute attribute = group.createAttribute(attributeName, dataType, dataSpace);

double attributeValue[2];
attributeValue[0] = x;
attributeValue[1] = y;

attribute.write(dataType, attributeValue);

但它创造了一个数组类型属性在 HDF5 文件中。

我知道可以创建一个包含多个值的属性,因为我可以使用 HDFView GUI 软件来完成它(第一个是使用上面的代码创建的,第二行是使用 GUI 创建的属性 - 我想创建这种类型属性):

任何帮助将不胜感激 !


在不确切知道您想要完成什么的情况下,我相信您正在寻找的是使用 HDF5 复合数据类型 H5::CompType 的自定义数据类型,该数据类型通常用于保存简单的结构。取自HDF5 C++ 复合示例页面 https://www.hdfgroup.org/HDF5/doc/cpplus_RM/compound_8cpp-example.html,结构体

  typedef struct s1_t {
    int    a;
    float  b;
    double c;
  } s1_t;

具有关联的复合数据类型:

  CompType mtype1( sizeof(s1_t) );
  mtype1.insertMember( MEMBER1, HOFFSET(s1_t, a), PredType::NATIVE_INT);
  mtype1.insertMember( MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_DOUBLE);
  mtype1.insertMember( MEMBER2, HOFFSET(s1_t, b), PredType::NATIVE_FLOAT);

然后,复合数据类型的处理方式与本机数据类型相同,并且也可以保存为属性。

Edit

您在上面的代码中犯的错误是,当您实际上不想保存数组时,将数据类型定义为 H5::ArrayType。您真正想要的是保存在更高维数据空间中的简单数据类型(例如 PredType::NATIVE_DOUBLE)。

#include "H5Cpp.h"

#ifndef H5_NO_NAMESPACE
  using namespace H5;
#ifndef H5_NO_STD
  using std::cout;
  using std::endl;
#endif  // H5_NO_STD
#endif  
const H5std_string FILE_NAME("save.h5");
const H5std_string ATT_NAME("Attribute");

int main(){
  const hsize_t dims=5;
  int ndims=1;

  DataType dtype=PredType::NATIVE_DOUBLE;

  H5File h5file(FILE_NAME, H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);

  DataSpace* dspace = new DataSpace(ndims,&dims);
  Attribute att=h5file.createAttribute(ATT_NAME,dtype,*dspace);
  delete dspace;

  double attvalue[dims];
  for(auto i=0;i<dims;++i) attvalue[i]=i;

  att.write(dtype,attvalue);
  h5file.close();

  return 0;
} 

这应该重现上面的“createdUsingHDFVIEW”属性(数据类型除外)。我无法检查以确保我没有 HDFView。我一开始并没有想到这一点,因为我倾向于将 H5::DataSpace 视为一种数组类型(实际上它就是)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C++ API 在 HDF5 文件中创建多值属性 的相关文章

随机推荐