使用Visual C ++将2-D数组int [n] [m]写入HDF5文件

时间:2014-07-03 19:02:37

标签: c++ visual-c++ hdf5 hdf

我刚刚开始使用HDF5,并会对以下内容提出一些建议。

我有一个二维数组:data[][]传入一个方法。该方法如下:

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

数据的大小实际上不是48 x 100,而是48 x size [i]。即每行可以是不同的长度!在我正在处理的一个简单的例子中,所有行都是相同的大小(但不是100),所以你可以说这个数组是48 X size [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而我只需要一小部分。

我想到我可以使用双ptrs int **或vector&gt;但我坚持这一点。据我所知,“写”需要一个void * ptr。另外,我希望文件“看起来正确”。即一个包含所有数据行的巨行是不可取的,如果我必须走那条路,有人需要通过一种灵活的方式来存储信息,这样我就可以从文件中读回数据(可能将行长度作为属性存储) ?)。

也许我真正的问题是找到非平凡用例的C ++示例。

非常感谢任何帮助。

戴夫

1 个答案:

答案 0 :(得分:2)

如果你的数据是向量的向量(这似乎对你的用例有意义),你可以使用variable length arrays来完成它:

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);
}