【发布时间】:2013-08-06 18:08:59
【问题描述】:
我有一个需要用 C++ 读取的 HDF5 文件,但我遇到了问题,因为文件的格式似乎有点复杂......
HDF5 文件包含从两个设备保存的数据。数据是时间序列;它可以看作是两个数组,一个用于时间,第二个用于设备的实际输出。 采集次数是用户定义的,但两台设备的采集次数相同(因为它们的数据是同时采集的)。
例如,一个文件将包含来自 10 次采集的数据,其组织形式类似于:
/Device1/Acquisition_000
/Device1/Acquisition_001
[...]
/Device2/Acquisition_000
/Device2/Acquisition_001
[...]
每次采集都会包含一个时间数组和一个数据数组。
这是 HDFView 在文件中看到的屏幕截图:
我虽然“路径”/Device2/Acquisition_000 是一个数据集,并试图读取它,但我遇到了麻烦。然后我使用 h5dump 转储了 .h5 文件并得到以下信息:
HDF5 "data.h5" {
GROUP "/" {
GROUP "Device1" {
DATASET "Acquisition_000" {
DATATYPE H5T_COMPOUND {
H5T_IEEE_F64BE "Time";
H5T_IEEE_F64BE "Signal";
}
DATASPACE SIMPLE { ( 270000 ) / ( 270000 ) }
DATA {
(0): {
0,
-0.0933597
},
(1): {
2e-05,
-0.0476648
},
(2): {
4e-05,
-0.0628964
},
[...]
现在我不知道我应该如何阅读该结构。我看到了 H5T_COMPOUND,所以我尝试了 http://www.hdfgroup.org/HDF5/doc/cpplus_RM/compound_8cpp-example.html 的复合示例,但 dataset->read() 似乎无法读取数据; valgrind 报告在 std::cout'ing 循环中的数据时访问未初始化的数据。
另一个混乱的来源是转储中的“H5T_IEEE_F64BE”;不是大端的BE部分吗?生成数据的机器和读取数据的机器都是 x86_64...
如何将“时间”和“信号”数组读入 C/C++ 数组?
作为参考,这是我尝试修改示例:
const H5std_string FILE_NAME("data.h5");
const H5std_string DATASET_NAME("/Device1/Acquisition_000/");
H5File file(FILE_NAME, H5F_ACC_RDONLY);
DataSet dataset = file.openDataSet(DATASET_NAME);
const H5std_string MEMBER_TIME("time_name");
const H5std_string MEMBER_SIGN("signal_name");
// Try reading a single array:
CompType mtype3( sizeof(double) );
mtype3.insertMember(MEMBER_SIGN, 0, PredType::NATIVE_DOUBLE);
double *data_signal = new double[270000];
memset(data_signal, 0, 270000);
dataset.read(data_signal, mtype3);
// Print the data
for (int i = 0 ; i < 10 ; i++)
{
std::cout << "data_signal[i=" << i << "] = " << data_signal[i] << std::endl;
}
及其输出:
data_signal[i=0] = 0
data_signal[i=1] = 0
data_signal[i=2] = 0
data_signal[i=3] = 0
data_signal[i=4] = 0
data_signal[i=5] = 0
data_signal[i=6] = 0
data_signal[i=7] = 0
data_signal[i=8] = 0
data_signal[i=9] = 0
此外,Matlab 可以使用以下方式读取文件:
data = h5read('data.h5', '/Device1/Acquisition_000')
data =
Time: [270000x1 double]
Signal: [270000x1 double]
非常感谢。
【问题讨论】:
-
我真的帮不上什么忙,但我记得使用 HDF5 文件是多么令人沮丧,我只想祝你好运 :-) +1 提出一个恰当的问题。