如何使用 C++ 在 HDF5 文件中创建多值属性 API
How to create multi-value attribute in a HDF5 file using C++ API
编辑开始
我正在尝试创建一个基于原生类型(float、int...)的 "pair, triplet or n-uplet" 属性:
- 一对浮点数,浮点数三元组,浮点数 n-uplet 属性
- 整数对,整数三元组,整数 n 元组属性
我不是要创建 "Array" 属性,我不是要创建 "Compound" 属性
编辑结束
我正在尝试创建一个基于原生类型(浮点型、整数...)但包含 2,3 个或更多值(相当于一对或 n-uplet)的属性。
我不想创建数组!我想创建一些与数组非常相似的东西,但又不一样
我可以通过这种方式创建单值属性(对于 "double" 属性):
H5::DataSpace dataSpace = H5::DataSpace();
H5::Attribute attribute = group.createAttribute(attributeName, H5::PredType::IEEE_F64LE, dataSpace);
attribute.write(H5::PredType::IEEE_F64LE, &attributeValue);
要创建几个 "double",我已经试过了:
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++ compound example page,结构
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);
然后,复合数据类型的处理方式与本机数据类型相同,也可以保存为属性。
编辑
您在上面的代码中犯的错误是将您的数据类型定义为 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 视为一种数组(实际上是)。
编辑开始
我正在尝试创建一个基于原生类型(float、int...)的 "pair, triplet or n-uplet" 属性:
- 一对浮点数,浮点数三元组,浮点数 n-uplet 属性
- 整数对,整数三元组,整数 n 元组属性
我不是要创建 "Array" 属性,我不是要创建 "Compound" 属性
编辑结束
我正在尝试创建一个基于原生类型(浮点型、整数...)但包含 2,3 个或更多值(相当于一对或 n-uplet)的属性。
我不想创建数组!我想创建一些与数组非常相似的东西,但又不一样
我可以通过这种方式创建单值属性(对于 "double" 属性):
H5::DataSpace dataSpace = H5::DataSpace();
H5::Attribute attribute = group.createAttribute(attributeName, H5::PredType::IEEE_F64LE, dataSpace);
attribute.write(H5::PredType::IEEE_F64LE, &attributeValue);
要创建几个 "double",我已经试过了:
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++ compound example page,结构
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);
然后,复合数据类型的处理方式与本机数据类型相同,也可以保存为属性。
编辑
您在上面的代码中犯的错误是将您的数据类型定义为 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 视为一种数组(实际上是)。