使用 Visual C++ 将二维数组 int[n][m] 写入 HDF5 文件
Posted
技术标签:
【中文标题】使用 Visual C++ 将二维数组 int[n][m] 写入 HDF5 文件【英文标题】:Writing 2-D array int[n][m] to HDF5 file using Visual C++ 【发布时间】:2014-08-25 00:50:08 【问题描述】:我刚刚开始使用 HDF5,希望对以下内容提供一些建议。
我有一个二维数组:data[][]
传递给一个方法。方法如下:
void WriteData( int data[48][100], int sizes[48])
数据的大小实际上不是 48 x 100,而是 48 x sizes[i]。 IE。每一行可能是不同的长度!在我正在处理的一个简单情况下,所有行的大小都相同(但不是 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。另外,我希望文件“看起来正确”。 IE。一个包含所有数据行的巨大行是不可取的,如果我必须走那条路,有人需要沟通一种巧妙的方式来存储信息,使我能够从文件中读回数据(也许将行长度存储为属性?)。
也许我真正的问题是找到非平凡用例的 C++ 示例。
非常感谢任何帮助。
戴夫
【问题讨论】:
我怀疑您可能会从研究有关 VL(可变长度)数据类型主题的 HDF 文档中受益。你可以从这里开始阅读:hdfgroup.org/HDF5/doc/…这不是我用过的 HDF5 的一个特性,所以没有有用的提示或技巧。 是的,您需要一个variable-length arrays 的简单数据集(1D,长度 48)。 【参考方案1】:如果您的数据是向量的向量(这似乎对您的用例有意义),您可以使用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);
【讨论】:
以上是关于使用 Visual C++ 将二维数组 int[n][m] 写入 HDF5 文件的主要内容,如果未能解决你的问题,请参考以下文章
访问 Matrix 类 (C++) 中的二维数组 (Visual Studio 2010)