3

我刚刚开始使用 HDF5,希望能得到以下方面的建议。

我有一个二维数组: data[][]传递给一个方法。该方法如下所示:

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

数据的大小实际上不是 48 x 100,而是 48 x sizes[i]。即每一行可以是不同的长度!在我正在处理的一个简单情况下,所有行的大小都相同(但不是 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);
}

有没有办法在一个 DataSet 中一次写入所有数据?对于所有行的长度相同的简单情况,也许一种解决方案是针对参差不齐的行的另一种解决方案?

我尝试了几件事无济于事。我调用了dataSet.write(data, intDataType),即我把整个数组扔给了它。我似乎在文件中得到了垃圾,我怀疑是因为存储数据的数组实际上是 48x100,我只需要其中的一小部分。

我突然想到我可以使用 double ptrs int** 或 vector> 但我坚持下去。据我所知,“写”需要一个 void* ptr。另外,我希望文件“看起来正确”。即一个包含所有数据行的巨大行是不可取的,如果我必须走那条路,那么有人需要传达一种巧妙的方式来存储允许我从文件中读回数据的信息(也许将行长度存储为属性?)。

也许我真正的问题是找到非平凡用例的 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 回答