2012-02-12 2 views
6

Есть ли библиотеки или заголовки, доступные для создания векторов векторов C++ или boost :: multi_arrays для наборов данных HDF5?написать boost :: multi_array to hdf5 dataset

Я посмотрел примеры HDF5 C++, и они просто используют синтаксис C++ для вызова c-функций, и они только записывают статические c-массивы в свои наборы данных (см. Create.cpp).

Я пропустил пункт !?

Большое спасибо заранее, Адам

+1

да да да, API HDF5 С ++ ** ужасно ** , Он очень близок к базовому API-интерфейсу API без каких-либо попыток предоставить полезный C++-интерфейс. – Walter

ответ

1

Я не знаю ни одной. Обертки HDF5 C++ не так уж хороши, особенно потому, что они не позволяют сочетать с параллельным HDF5. Итак, я написал свои собственные обертки примерно через 2 часа, и все работает отлично. В конечном счете, вам просто нужно вызвать его напрямую (или косвенно, если вы решите сделать привязки на C++).

К счастью, как векторы, так и multi_arrays являются непрерывными в хранилище, поэтому вы можете просто передавать данные из них непосредственно в вызовы функций HDF5.

+0

Привет, ОК Спасибо за то, что сообщили мне - мне просто нужно продолжить с этим! ;-) – AdamC

5

Вот как писать размерность multi_array Св.нет с в формате HDF5

Вот короткий пример:

#include <boost/multi_array.hpp> 
using boost::multi_array; 
using boost::extents; 


// allocate array 
int NX = 5, NY = 6, NZ = 7; 
multi_array<double, 3> 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); 

Вот код write_hdf5().

Во-первых, мы должны сопоставлять типы C++ с типами HDF5 (из C++ api). Я закомментировать строки, которые приводят к дублировать определения, поскольку некоторые из <stdint.h> типов (например uint8_t) являются псевдонимами стандартных типов (например unsigned char)

#include <cstdint> 

//!_______________________________________________________________________________________ 
//!  
//!  map types to HDF5 types 
//!   
//!  
//!  \author lg (04 March 2013) 
//!_______________________________________________________________________________________ 

template<typename T> 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<char>     { H5::IntType type { H5::PredType::NATIVE_CHAR  }; }; 
//template<> struct get_hdf5_data_type<unsigned char>  { H5::IntType type { H5::PredType::NATIVE_UCHAR  }; }; 
//template<> struct get_hdf5_data_type<short>    { H5::IntType type { H5::PredType::NATIVE_SHORT  }; }; 
//template<> struct get_hdf5_data_type<unsigned short>  { H5::IntType type { H5::PredType::NATIVE_USHORT  }; }; 
//template<> struct get_hdf5_data_type<int>     { H5::IntType type { H5::PredType::NATIVE_INT  }; }; 
//template<> struct get_hdf5_data_type<unsigned int>  { H5::IntType type { H5::PredType::NATIVE_UINT  }; }; 
//template<> struct get_hdf5_data_type<long>    { H5::IntType type { H5::PredType::NATIVE_LONG  }; }; 
//template<> struct get_hdf5_data_type<unsigned long>  { H5::IntType type { H5::PredType::NATIVE_ULONG  }; }; 
template<> struct get_hdf5_data_type<long long>    { H5::IntType type { H5::PredType::NATIVE_LLONG  }; }; 
template<> struct get_hdf5_data_type<unsigned long long> { H5::IntType type { H5::PredType::NATIVE_ULLONG  }; }; 
template<> struct get_hdf5_data_type<int8_t>    { H5::IntType type { H5::PredType::NATIVE_INT8  }; }; 
template<> struct get_hdf5_data_type<uint8_t>    { H5::IntType type { H5::PredType::NATIVE_UINT8  }; }; 
template<> struct get_hdf5_data_type<int16_t>    { H5::IntType type { H5::PredType::NATIVE_INT16  }; }; 
template<> struct get_hdf5_data_type<uint16_t>    { H5::IntType type { H5::PredType::NATIVE_UINT16  }; }; 
template<> struct get_hdf5_data_type<int32_t>    { H5::IntType type { H5::PredType::NATIVE_INT32  }; }; 
template<> struct get_hdf5_data_type<uint32_t>    { H5::IntType type { H5::PredType::NATIVE_UINT32  }; }; 
template<> struct get_hdf5_data_type<int64_t>    { H5::IntType type { H5::PredType::NATIVE_INT64  }; }; 
template<> struct get_hdf5_data_type<uint64_t>    { H5::IntType type { H5::PredType::NATIVE_UINT64  }; }; 
template<> struct get_hdf5_data_type<float>     { H5::FloatType type { H5::PredType::NATIVE_FLOAT  }; }; 
template<> struct get_hdf5_data_type<double>    { H5::FloatType type { H5::PredType::NATIVE_DOUBLE  }; }; 
template<> struct get_hdf5_data_type<long double>   { H5::FloatType type { H5::PredType::NATIVE_LDOUBLE }; }; 

Тогда мы можем использовать немного шаблона пересылку магии, чтобы сделать функцию нужного типа для вывода наших данных. Поскольку это шаблон кода, он должен жить в файле заголовка, если вы собираетесь выводить hdf5 массивы из нескольких исходных файлов в программе:

//!_______________________________________________________________________________________ 
//!  
//!  write_hdf5 multi_array 
//!   
//!  \author leo Goodstadt (04 March 2013) 
//!  
//!_______________________________________________________________________________________ 
template<typename T, std::size_t DIMENSIONS, typename hdf5_data_type> 
void do_write_hdf5(H5::H5File file, const std::string& data_set_name, const boost::multi_array<T, DIMENSIONS>& data, hdf5_data_type& datatype) 
{ 
    // Little endian for x86 
    //FloatType datatype(get_hdf5_data_type<T>::type()); 
    datatype.setOrder(H5T_ORDER_LE); 

    vector<hsize_t> 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<typename T, std::size_t DIMENSIONS> 
void write_hdf5(H5::H5File file, const std::string& data_set_name, const boost::multi_array<T, DIMENSIONS>& data) 
{ 

    get_hdf5_data_type<T> hdf_data_type; 
    do_write_hdf5(file, data_set_name, data, hdf_data_type.type); 
} 
+0

Вы имели в виду использовать 'template <> struct get_hdf5_data_type {static H5 :: IntType type() {return H5 :: PredType :: NATIVE_CHAR; }}; '? –

Смежные вопросы