3

私は HDF5 を使い始めたばかりで、次の点についてアドバイスをいただければ幸いです。

私は 2 次元配列を持っています: data[][]メソッドに渡されます。メソッドは次のようになります。

void WriteData( int data[48][100], int sizes[48])

データのサイズは実際には 48 x 100 ではなく、むしろ 48 x サイズです[i]。つまり、各行の長さは異なる可能性があります。私が扱っている 1 つの単純なケースでは、すべての行が同じサイズ (ただし 100 ではない) であるため、配列は 48 X サイズ [0] であると言えます。

これを HDF5 に書き込むにはどうすればよいですか?

0 から 48 までループして、各行の新しいデータセットを作成する作業コードがあります。

何かのようなもの:

for (int i = 0; i < 48; i++)
{
   hsize_t      dsSize[2];
   dsSize[0] = 48;
   dsSize[1] = sizes[0];  // use sizes[i] in most general case
   // Create the Data Space
   DataSpace dataSpace = DataSpace(2, dsSize);
   DataSet dataSet = group.createDataSet(dataSetName, intDataType, dataSpace);
   dataSet.write(data[i], intDataType);
}

1 つの DataSet にデータを一度に書き込む方法はありますか? おそらく、すべての行が同じ長さの単純なケースに対する 1 つの解決策と、不規則な行に対する別の解決策でしょうか?

私は無駄にいくつかのことを試しました。私は dataSet.write(data, intDataType) を呼び出しました。つまり、配列全体を投げました。データが格納されている配列が実際には 48x100 であり、そのごく一部しか必要としないため、ファイルにガベージが含まれているようです。

double ptrs int** または vector> を使用できるかもしれないと思いましたが、それに固執しています。私が知る限り、「書き込み」には void* ptr が必要です。また、ファイルが「正しく見える」ようにしたいと思います。つまり、データのすべての行を含む 1 つの巨大な行は望ましくありません。そのルートに行かなければならない場合、ファイルからデータを読み戻すことができる情報を保存するための巧妙な方法を誰かが伝える必要があります (おそらく、行の長さを次のように保存します)。属性?)

おそらく、私の本当の問題は、重要なユース ケースの C++ の例を見つけることです。

どんな助けでも大歓迎です。

デイブ

4

1 に答える 1

4

データがベクトルのベクトルである場合、可変長配列を使用してそれを行う方法は次のとおりです(ユースケースには意味があるようです)。

void WriteData(const std::vector< std::vector<int> >& data)
{
    hsize_t dim(data.size());
    H5::DataSpace dspace(1, &dim);
    H5::VarLenType dtype(H5::PredType::NATIVE_INT);
    H5::DataSet dset(group.createDataSet(dataSetName, dtype, dspace));
    hvl_t vl[dim];
    for (hsize_t i = 0; i < dim; ++i)
    {
        vl[i].len = data[i].size();
        vl[i].p = &data[i][0];
    }
    dset.write(vl, dtype);
}
于 2014-07-08T02:17:33.433 に答える