複合型(int、double、double)のHDF5ファイルがあります。現在、ドキュメントの例に従って、結果を構造体の配列に格納することにより、単一の操作でそれを読んでいます。
ただし、代わりに3つの部分をそれぞれ異なる配列に保存したいので、3つのポインター(int *、double *、double *)を提供し、データをコピーせずに3つの配列でデータを直接読み取ります。
誰かがそれを行う方法についての提案がありますか?
複合型(int、double、double)のHDF5ファイルがあります。現在、ドキュメントの例に従って、結果を構造体の配列に格納することにより、単一の操作でそれを読んでいます。
ただし、代わりに3つの部分をそれぞれ異なる配列に保存したいので、3つのポインター(int *、double *、double *)を提供し、データをコピーせずに3つの配列でデータを直接読み取ります。
誰かがそれを行う方法についての提案がありますか?
直接はできないと思います。
構造体の配列をループ内の3つの配列に簡単にコピーできます。
int a[n];
double b[n], c[n];
for (int i = 0; i < n; i++)
{
a[i] = s[i].a;
b[i] = s[i].b;
c[i] = s[i].c;
}
(一定の)サイズs
の配列であると仮定しますが、直接HDF5の方法を探しているように感じます…</ p>
struct { int a; double b; double c; }
n
明らかに、複合型はアトミックであると私は信じているので、ハイパースラブは機能しません。とにかく、複合型は、データがファイルに複合的に格納されることを意味するので、おそらくそのように読み取る方が効率的です。私が提供したソリューションの唯一の制限は、アレイが本当に大きい場合のメモリです。でも大丈夫なはずの最近のコンピューターでは;)
複合タイプで単一のフィールドを定義できます。要素のdset
3つのフィールド"a","b","c"
のようにデータセットを開いたとすると、LENGTH
int a[LENGTH];
double b[LENGTH], c[LENGTH];
CompType atype(sizeof(int));
atype.insertMember("a", 0, PredType::NATIVE_INT);
dset.read(a, atype);
CompType btype(sizeof(double));
btype.insertMember("b", 0, PredType::NATIVE_DOUBLE);
dset.read(b, btype);
CompType ctype(sizeof(double));
ctype.insertMember("c", 0, PredType::NATIVE_DOUBLE);
dset.read(c, ctype);
これはあなたが求めたことをしているはずです。たぶん、あなたはすでに「ファイルを3回読み取る」ことによってこれを行っていますか?