Estoy usando el HDF5 C++ API para escribir archivos de conjunto de datos en 2D. HDF Group tiene an example to create un archivo HDF5 a partir de un tamaño de matriz estáticamente definido, que he modificado para adaptarlo a mis necesidades a continuación. Sin embargo, necesito una matriz dinámica, donde NX
y NY
se determinan en tiempo de ejecución. He encontrado another solution to create 2D arrays using the "new" keyword para ayudar a crear una matriz dinámica. Aquí es lo que tengo:HDF5 Interfaz C++: escribir matrices 2D dinámicas
#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;
}
El archivo resultante, sin embargo, no es el esperado (salida de 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
}
}
}
}
El problema se deriva de nuevo a la forma en que se creó la matriz 2D (ya que esto el ejemplo funciona bien con un método de matriz estática). A medida que entiendo de this email thread:
La biblioteca HDF5 espera una matriz contigua de elementos, no punteros a elementos de dimensiones inferiores
como soy bastante nuevo en C++/HDF5, estoy no estoy seguro de cómo crear una matriz de tamaño dinámico en tiempo de ejecución que es una matriz contigua de elementos. No quiero hacer el método más complicado "hipereslabio" descrito en el hilo del correo electrónico, ya que parece demasiado complicado. Cualquier ayuda es apreciada.
Esta solución es simple de implementar y escalas muy bien (estoy usando tamaños de matriz con elementos de 21.9M). El resultado se verifica perfectamente en la salida del archivo HDF5. –
Funciona como un encanto. Gracias. – CuriousCase
Sé que esto es bastante viejo, pero creo que hay un error en la última oración. Debería ser: (en lugar de 'data [i] [j]') –