écrire un jeu de données boost :: multi_array to hdf5

Existe-t-il des bibliothèques ou des en-têtes disponibles pour faciliter l’écriture de vecteurs c ++ ou de boost :: multi_arrays to HDF5?

J’ai examiné les exemples HDF5 C ++ et ils utilisent simplement la syntaxe c ++ pour appeler des fonctions c et n’écrivent que des tableaux c statiques dans leurs ensembles de données (voir create.cpp).

Est-ce que je manque le point!?

Merci d’avance, Adam

Voici comment écrire N dimension multi_array s au format HDF5

Voici un court exemple:

 #include  using boost::multi_array; using boost::extents; // allocate array int NX = 5, NY = 6, NZ = 7; multi_array float_data(extents[NX][NY][NZ]); // initialise the array for (int ii = 0; ii != NX; ii++) for (int jj = 0; jj != NY; jj++) for (int kk = 0; kk != NZ; kk++) float_data[ii][jj][kk] = ii + jj + kk; // // write to HDF5 format // H5::H5File file("SDS.h5", H5F_ACC_TRUNC); write_hdf5(file, "doubleArray", float_data ); 

Voici le code pour write_hdf5() .

Tout d’abord, nous devons mapper les types c ++ aux types HDF5 (à partir de l’API c ++ H5 ). J’ai commenté des lignes qui conduisent à des définitions en double, car certains des types (par exemple, uint8_t ) sont des alias de types standard (par exemple, un caractère unsigned char ).

 #include  //!_______________________________________________________________________________________ //! //! map types to HDF5 types //! //! //! \author lg (04 March 2013) //!_______________________________________________________________________________________ template struct get_hdf5_data_type { static H5::PredType type() { //static_assert(false, "Unknown HDF5 data type"); return H5::PredType::NATIVE_DOUBLE; } }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_CHAR }; }; //template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_UCHAR }; }; //template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_SHORT }; }; //template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_USHORT }; }; //template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_INT }; }; //template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_UINT }; }; //template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_LONG }; }; //template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_ULONG }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_LLONG }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_ULLONG }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_INT8 }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_UINT8 }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_INT16 }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_UINT16 }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_INT32 }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_UINT32 }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_INT64 }; }; template<> struct get_hdf5_data_type { H5::IntType type { H5::PredType::NATIVE_UINT64 }; }; template<> struct get_hdf5_data_type { H5::FloatType type { H5::PredType::NATIVE_FLOAT }; }; template<> struct get_hdf5_data_type { H5::FloatType type { H5::PredType::NATIVE_DOUBLE }; }; template<> struct get_hdf5_data_type { H5::FloatType type { H5::PredType::NATIVE_LDOUBLE }; }; 

Ensuite, nous pouvons utiliser un peu de magie de transfert de modèle pour créer une fonction du bon type afin de générer nos données. S’agissant d’un code de modèle, il doit figurer dans un fichier d’en-tête si vous souhaitez générer des tableaux HDF5 à partir de plusieurs fichiers sources dans votre programme:

 //!_______________________________________________________________________________________ //! //! write_hdf5 multi_array //! //! \author leo Goodstadt (04 March 2013) //! //!_______________________________________________________________________________________ template void do_write_hdf5(H5::H5File file, const std::ssortingng& data_set_name, const boost::multi_array& data, hdf5_data_type& datatype) { // Little endian for x86 //FloatType datatype(get_hdf5_data_type::type()); datatype.setOrder(H5T_ORDER_LE); vector dimensions(data.shape(), data.shape() + DIMENSIONS); H5::DataSpace dataspace(DIMENSIONS, dimensions.data()); H5::DataSet dataset = file.createDataSet(data_set_name, datatype, dataspace); dataset.write(data.data(), datatype); } template void write_hdf5(H5::H5File file, const std::ssortingng& data_set_name, const boost::multi_array& data ) { get_hdf5_data_type hdf_data_type; do_write_hdf5(file, data_set_name, data, hdf_data_type.type); } 

Je n’en connais pas. Les wrappers HDF5 C ++ ne sont pas très performants, notamment parce qu’ils ne permettent pas la combinaison avec HDF5 parallèle. Donc, j’ai écrit mes propres enveloppes en environ 2 heures et cela fonctionne très bien. En fin de compte, vous devrez simplement l’appeler directement (ou indirectement si vous choisissez de faire des liaisons C ++).

Heureusement, les vecteurs et les multi_arrays sont contigus dans le stockage. Vous pouvez donc simplement transférer leurs données directement dans les appels de fonction HDF5.