gpt4 book ai didi

c++ - HDF5 C++ 接口(interface) : writing dynamic 2D arrays

转载 作者:可可西里 更新时间:2023-11-01 15:50:22 35 4
gpt4 key购买 nike

我正在使用 HDF5 C++ API编写二维数组数据集文件。 HDF集团有an example to create来自静态定义数组大小的 HDF5 文件,我已对其进行修改以满足下面的需求。但是,我需要一个动态数组,其中 NXNY 都是在运行时确定的。我找到了 another solution to create 2D arrays using the "new" keyword帮助创建一个动态数组。这是我所拥有的:

#include "StdAfx.h"
#include "H5Cpp.h"
using namespace H5;

const H5std_string FILE_NAME("C:\\SDS.h5");
const H5std_string DATASET_NAME("FloatArray");
const int NX = 5; // dataset dimensions
const int NY = 6;

int main (void)
{
// Create a 2D array using "new" method
double **data = new double*[NX];
for (int j = 0; j < NX; j++) // 0 1 2 3 4 5
{ // 1 2 3 4 5 6
data[j] = new double[NY]; // 2 3 4 5 6 7
for (int i = 0; i < NY; i++) // 3 4 5 6 7 8
data[j][i] = (float)(i + j); // 4 5 6 7 8 9
}

// Create HDF5 file and dataset
H5File file(FILE_NAME, H5F_ACC_TRUNC);
hsize_t dimsf[2] = {NX, NY};
DataSpace dataspace(2, dimsf);
DataSet dataset = file.createDataSet(DATASET_NAME, PredType::NATIVE_DOUBLE,
dataspace);
// Attempt to write data to HDF5 file
dataset.write(data, PredType::NATIVE_DOUBLE);

// Clean up
for(int j = 0; j < NX; j++)
delete [] data[j];
delete [] data;
return 0;
}

然而,生成的文件并不像预期的那样(来自 hdf5dump 的输出):

HDF5 "SDS.h5" {
GROUP "/" {
DATASET "FloatArray" {
DATATYPE H5T_IEEE_F64LE
DATASPACE SIMPLE { ( 5, 6 ) / ( 5, 6 ) }
DATA {
(0,0): 4.76465e-307, 4.76541e-307, -7.84591e+298, -2.53017e-098, 0,
(0,5): 3.8981e-308,
(1,0): 4.76454e-307, 0, 2.122e-314, -7.84591e+298, 0, 1,
(2,0): 2, 3, 4, 5, -2.53017e-098, -2.65698e+303,
(3,0): 0, 3.89814e-308, 4.76492e-307, 0, 2.122e-314, -7.84591e+298,
(4,0): 1, 2, 3, 4, 5, 6
}
}
}
}

问题的根源在于二维数组是如何创建的(因为这个例子可以很好地使用静态数组方法)。据我了解this email thread :

The HDF5 library expects to a contiguous array of elements, not pointers to elements in lower dimensions

由于我是 C++/HDF5 的新手,我不确定如何在运行时创建一个动态大小的数组,它是一个连续的元素数组。我不想执行电子邮件线程中描述的更复杂的“hyperslab”方法,因为这看起来过于复杂。感谢您的帮助。

最佳答案

嗯,我对 HDF5 一无所知,但是可以使用大小为 NX * NY 的一维数组来模拟 C++ 中具有连续缓冲区的动态二维数组。例如:

分配:

double *data = new double[NX*NY];

元素访问:

 data[j*NY + i]

(而不是 data[j][i])

关于c++ - HDF5 C++ 接口(interface) : writing dynamic 2D arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7412042/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com