如何使用 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 文件中创建多值属性 的相关文章

  • MVC3 中的角色管理

    我想向应用程序添加一项功能 以便只有管理员才能创建用户 并且他可以向用户提供对特定页面的访问权限 他可以创建角色 可以为用户提供不同的角色 我正在使用 Visual Studio 2010 并在 MVC3 中构建此应用程序 请给我建议来弥补
  • OpenCV 旋转图像而不裁剪澄清

    我想扩展这个主题 参考用户 Lars Schillingmann 给出的这个 SO 问题和接受的答案 在 C 中的 OpenCV 中旋转图像而不裁剪 https stackoverflow com questions 22041699 ro
  • 使用 .Net HttpListener 进行多线程

    我有一个听众 listener new HttpListener listener Prefixes Add http 8077 listener Start listenerThread new Thread HandleRequests
  • 模板:模板函数与类模板成员函数不能很好地配合[重复]

    这个问题在这里已经有答案了 这是我实际拥有的一些代码的最小测试用例 当它尝试评估时失败a getResult b test cpp In function void printStuff const A test cpp 6 error e
  • 可空可选参数

    我在 asp net mvc 应用程序中使用带有 edmx 文件和 POCO 的实体框架 4 首先 我有一个映射到数据库中的表的人员类 public class Person public Int32 ID get set public s
  • C# CreatePipe() -> 受保护的内存错误

    我尝试使用 C 创建管道 代码非常简单 但是当行与CreatePipe 调用被执行我得到一个System AccessViolationException并出现以下错误消息 尝试读取或写入受保护的内存 这通常表明其他内存已损坏 这是我的表单
  • C# 中的序列化和对象版本控制

    如果我想序列化一个对象 我必须使用 Serializable 属性和所有成员变量将被写入该文件 我不知道如何进行版本控制 例如如果我添加一个新的成员变量 重命名变量或仅删除变量 然后打开 反序列化 文件 如何确定对象 文件版本 以便我可以正
  • 将 0x1234 转换为 0x11223344

    如何高性能地将十六进制数0x1234扩展到0x11223344 unsigned int c 0x1234 b b c 0xff lt lt 4 c 0xf c 0xff0 lt lt 8 c 0xff00 lt lt 12 c 0xf00
  • CSV 提供的数据源第一列中存在奇数字符

    我有一个 CSV 文件 已添加到 Visual Studio 单元测试项目中 它有七列 如下所示 assessmentitemid reviewer1 reviewer2 reviewer3 reviewer4 reviewer5 revi
  • 显示与 C# 生成的表单相邻的另一种表单

    如何产生一种新形式 例如Form2 from Form1 但要确保Form2毗邻于Form1 例如 就像是 button click handler method Form2 child new Form2 child Location n
  • 如何在configure.in中测试C++库的可用性?

    我正在 GNU Linux 上开发一个 C 项目 并且正在寻找一种方法来使用 Autotools 测试 IBM Informix 库的存在性和可用性 即编辑configure in 我没有使用 Autotools 的经验 所以基本上我是从该
  • Facebook C# SDK 从 V5 迁移到 V6

    我正在尝试从 SDK 的 V5 3 2 迁移到 V6 我有一个 ASP NET 4 0 Canvas 应用程序 我注意到现在不再有 facebook web dll 我以前使用过 并找到了以下信息 gt 删除 Facebook Web dl
  • 如何在 Unix 控制台或 Mac 终端中编译和运行 C/C++ 代码?

    如何在 Unix 控制台或 Mac 终端中编译 运行 C 或 C 代码 如果是一个简单的单源程序 make foo 源文件在哪里foo c foo cpp等等 你甚至不需要 makefile Make 有足够的内置规则将源文件构建为同名的可
  • 如何使用 Dapper 从 .NET 7 执行 Postgresql 函数,而不列出所有参数的数据类型

    我正在尝试将我的 NET 5 Web API 代码传输到 NET 7 我有一个名为的单例服务DataManager它实现了接口IDataManager 其中一项功能是Execute还有其他 C 函数 称为 Get GerMany 以及 In
  • C++ Microsoft:如何将 uuid/guid 与模板专业化相关联

    我想将 uuid guid 与模板专业化相关联 以下代码可用于将 uuid 与非模板接口 类 结构 关联 interface declspec uuid CECA446F 2BE6 4AAC A117 E395F27DF1F8 ITest
  • 有没有工具可以检测 Visual C++ 6.0 上的缓冲区溢出? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 由于堆问题 我一直遇到崩溃问题 所以我猜想某个地方发生了缓冲区溢出 我如何检测它 I use Compuware 边界检查器 http w
  • 在第 i 个位置切换一点[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中设置 清除和切换单个位 https stackoverflow com questions 47981 how do you set clear and toggle a single
  • 从文本文件中读取行并存储到数组中

    如何从文本文件中读取行并将其存储到数组中 例如 我有一个包含 45 行不同行的文本文件 我的尝试 int main int a 45 ifstream myfile enroll assg txt if myfile cout lt lt
  • 在使用 stop_token 等待条件变量_any 时是否需要拥有锁来请求停止?

    在等待条件变量时 更改谓词状态的线程必须拥有锁 因此在唤醒期间不会错过更新 根据文档 这是必要的 即使在使用原子变量时也是如此 不过我不确定是否request stop 已经正确处理了 那么问题是 这两个选项中哪一个是正确且符合标准的呢 j
  • 为什么我们从 MultiByte 转换为 WideChar?

    我习惯于处理 ASCII 字符串 但现在使用 UNICODE 我对一些术语感到非常困惑 什么是多字节字符以及什么是widechar有什么不同 多字节是指在内存中包含多个字节的字符吗 widechar只是一个数据类型来表示吗 为什么我们要从M

随机推荐