Я использую HDF5 C ++ API для записи файлов набора данных 2D-массива. Группа HDF имеет пример для создания файла HDF5 из статически определенного размера массива, который я изменил для соответствия моим потребностям ниже. Однако мне нужен динамический массив, в котором во время выполнения определяются и NX
, и NY
. Я нашел другое решение для создания двумерных массивов с помощью ключевого слова "new" , чтобы помочь создать динамический массив. Вот что у меня есть:
#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
}
}
}
}
Проблема связана с тем, как был создан 2D-массив (поскольку этот пример отлично работает с методом статического массива). Как я понял из этой ветки электронной почты :
Библиотека HDF5 рассчитывает на непрерывный массив элементов, а не
указатели на элементы более низких размеров
Поскольку я довольно плохо знаком с C ++ / HDF5, я не уверен, как создать динамически изменяемый массив во время выполнения, представляющий собой непрерывный массив элементов. Я не хочу делать более сложный метод «гиперсписки», описанный в ветке электронной почты, так как это выглядит слишком сложным. Любая помощь приветствуется.