1

複合型(int、double、double)のHDF5ファイルがあります。現在、ドキュメントの例に従って、結果を構造体の配列に格納することにより、単一の操作でそれを読んでいます。

ただし、代わりに3つの部分をそれぞれ異なる配列に保存したいので、3つのポインター(int *、double *、double *)を提供し、データをコピーせずに3つの配列でデータを直接読み取ります。

誰かがそれを行う方法についての提案がありますか?

4

2 に答える 2

1

直接はできないと思います。

構造体の配列をループ内の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

明らかに、複合型はアトミックであると私は信じているので、ハイパースラブは機能しません。とにかく、複合型は、データがファイルに複合的に格納されることを意味するので、おそらくそのように読み取る方が効率的です。私が提供したソリューションの唯一の制限は、アレイが本当に大きい場合のメモリです。でも大丈夫なはずの最近のコンピューターでは;)

于 2011-03-15T03:40:29.233 に答える
0

複合タイプで単一のフィールドを定義できます。要素のdset3つのフィールド"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回読み取る」ことによってこれを行っていますか?

于 2015-10-12T17:21:06.333 に答える