c++ HDF5将字符串头写入文件

wn9m85ua  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(216)

我正在尝试用C++编写一个HDF5文件,该文件基本上包含一个大型时间序列矩阵,格式如下

TimeStamp    Property1      Property2

我已经成功地写入了数据,我创建了一个数据集并使用了H5Dwrite函数。
现在我的问题是如何创建一个文件头,换句话说,如果我想把下面的数组写入文件...
[“时间戳”,“属性1”,“属性2”]
...并将其标记到列中,以便于以后使用(我计划用Python分析矩阵)。
我试着用H5Dwrite写一个字符串数组,但是失败了,我猜它想要一致的数据类型,所以它只想要浮点数,这是我的数据的数据类型。然后我读了关于这个元数据的东西,但是我有点不知道如何使用它?任何帮助都将非常感谢。
一个相关的附带问题是,矩阵的第一行可以是字符串,而其他行包含双精度数吗?

643ylb08

643ylb081#

清洁溶液

如果将数据存储为compound datatype的一维数组,成员为TimeStampProperty1Property2等,那么字段名将存储为元数据,并且应该易于在Python中读取。
我认为还有另一个干净的选择,但我只会提到它,因为我从来没有用过它自己:HDF5's Table Interface。阅读文档,看看您是否愿意使用它。

直接回答您的问题

现在是肮脏的选择:你可以给你现有的数据集添加字符串属性。有很多方法可以做到这一点。你可以有一个字符串属性,所有的字段名用分号分隔,或者每列一个属性。我不推荐这样做,因为这将是非常不标准的。
一个相关的附带问题是,矩阵的第一行可以是字符串,而其他行包含双精度数吗?
没有。

使用复合数据类型的示例

假设你有一个如下定义的结构:

struct Point { double timestamp, property1, property2; };

以及向量Point s:

std::vector<Point> points;

以及数据集dset和适当的内存和文件数据空间,那么您可以创建一个复合数据类型,如下所示:

H5::CompType type(sizeof(DataPoint));
type.insertMember("TimeStamp", HOFFSET(Point, timestamp), H5::PredType::NATIVE_DOUBLE);
type.insertMember("Property1", HOFFSET(Point, property1), H5::PredType::NATIVE_DOUBLE);
type.insertMember("Property2", HOFFSET(Point, property2), H5::PredType::NATIVE_DOUBLE);

并将数据写入文件,如下所示:

dset.write(&points[0], type, mem_space, file_space);

相关问题