C++ で読み取る必要がある HDF5 ファイルがありますが、ファイルの形式が少し複雑なため、問題が発生しています...
HDF5 ファイルには、2 つのデバイスから保存されたデータが含まれています。データは時系列です。1 つは時間用、もう 1 つはデバイスからの実際の出力用です。取得の数はユーザー定義ですが、取得の数は両方のデバイスで同じです (データが同時に取得されるため)。
たとえば、1 つのファイルには、次のような形式で編成された、たとえば 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 するときに、初期化されていないデータへのアクセスを報告します。
混乱の別の原因は、ダンプ内の「H5T_IEEE_F64BE」です。ビッグエンディアンのBE部分じゃないの?データを生成するマシンとそれを読み取るマシンの両方が x86_64 です...
"Time" および "Signal" 配列を 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]
どうもありがとう。