読者です 読者をやめる 読者になる 読者になる

C++によるHDF5からの入力

日曜日の全てをかけてHDF5とXDMFの使い方を調べてきたが、これでやっと一段落だろうか。
C++によるHDF5からのデータの入力方法について、公式サイトのsampleがこちら。

HDF5 C++ API: readdata.cpp

いろいろとsampleとしての処理を行っているためか、ぱっと見で把握できなかった。
そこで上を参考にして、ただdouble型の2次元配列を読み込むためだけのコードを作成してみた。
下記に示す。templateを使用すれば任意の型に対応できると思う。
(追記(11/3):boostのmulti_arrayを導入して一部簡略化した)

#include<iostream>
#include<H5Cpp.h>
#include"boost/multi_array.hpp"

using namespace std;

int main(){

	H5::H5File file("SDS.h5", H5F_ACC_RDONLY);
	H5::DataSet dataset = file.openDataSet("doubleArray2"); 
	H5::DataSpace dataspace = dataset.getSpace();

	int rank = dataspace.getSimpleExtentNdims();

	hsize_t dims_out[2];
	int ndims = dataspace.getSimpleExtentDims( dims_out, NULL);
	int NX = (unsigned long)(dims_out[0]);
	int NY = (unsigned long)(dims_out[1]);
	cout << "rank " << rank << ", dimensions " << NX << " x " << NY << endl;

	boost::multi_array<double,2> data(boost::extents[NX][NY]);

	dataset.read(data.data(),H5::PredType::NATIVE_DOUBLE);

	for(int i=0;i<NX;i++){
		for(int j=0;j<NY;j++) cout << data[i][j] << " ";
		cout << endl;
	}
}

先の書き込み用フォーマットと併せてオリジナルのクラスを作成すれば、HDF5におけるIO処理はほぼ全ての処理が自動化できる。
ここまでやって初めて、自分でバイナリのファイルを作成するよりはるかに作業の効率化が望めるだろう。週末をこれでつぶした甲斐はあったかな…。