Интерфейс HDF5 C ++: запись динамических 2D массивов

Я использую API HDF5 C ++ API для записи файлов набора данных массива 2D. Группа HDF имеет пример для создания файла HDF5 из статически определенного размера массива, который я модифицировал, чтобы набирать мои потребности ниже. Однако мне требуется динамический массив, где обои NX и NY определяются во время выполнения. Я нашел Другое решение для создания 2D-массивов с использованием ключевого слова «Новое» , чтобы помочь создать динамический массив. Вот то, что у меня есть:

#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, я не уверен, как создать массив динамически размера во время выполнения, который является смежным массивом элементов. Я не хочу делать более сложный метод «HypersLab», описанный в потоке электронной почты, так как это выглядит слишком сложно. Любая помощь ценится.

11
задан Community 23 May 2017 в 11:46
поделиться