我正在尝试从 C++ 编写 HDF5 文件。该文件基本上包含以下格式的大型时间序列矩阵
TimeStamp Property1 Property2
我已经成功写入数据,我创建了一个dset并使用了H5Dwrite函数。
现在我的问题是如何创建文件头,换句话说,如果我想将以下数组写入文件...
['时间戳'、'属性1'、'属性2']
...并将其标记到列中以便于以后使用(我计划在 Python 中分析矩阵)。如何做到这一点?
我尝试使用 H5Dwrite 写入字符串数组但失败了,我猜它需要一致的数据类型,所以它只需要 float ,这是我的数据的数据类型。然后我读到了有关元数据的内容,但我对如何使用它有点迷失?任何帮助将不胜感激。
一个相关的附带问题是矩阵的第一行可以是字符串而其他行可以包含 double 吗?
最佳答案
干净的解决方案
如果将数据存储为 compound datatype 的一维数组包含成员 TimeStamp
、Property1
、Property2
等,那么字段名称将存储为元数据,并且应该很容易在 Python 中读取。
我认为还有另一个干净的选项,但我只会提到它,因为我自己从未使用过它:HDF5's Table Interface 。阅读文档,看看您是否愿意使用它。
直接回答您的问题
现在是脏选项:您可以将字符串属性添加到现有数据集。有多种方法可以做到这一点。您可以拥有一个字符串属性,其中所有字段名称均以分号分隔,或者每列一个属性。我不推荐它,因为那是非常不标准的。
A related side question is can the first row of a matrix be a string and the others rows contain doubles?
没有。
使用复合数据类型的示例
假设您有一个如下定义的结构:
struct Point { double timestamp, property1, property2; };
和一个点
vector :
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);
关于c++ - HDF5 将字符串头写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23451900/