19template <
typename T, 
int M, 
int N>
 
   20inline size_t compute_total_size(
const Eigen::Matrix<T,M,N>& matrix) {
 
   21  return static_cast<size_t>(matrix.rows()) * 
static_cast<size_t>(matrix.cols());
 
   25template <
typename T, 
int M, 
int N>
 
   26inline size_t compute_total_size(
const std::vector<Eigen::Matrix<T,M,N>>& vec) {
 
   27  return vec.size() * compute_total_size(vec[0]);
 
   32template <
typename T, 
size_t Dims>
 
   33inline size_t compute_total_size(
const boost::multi_array<T, Dims>& vec) {
 
   34  return std::accumulate(vec.origin(), vec.origin() + vec.num_elements(), 
size_t{0u},
 
   35                         [](
size_t so_far, 
const T& v) {
 
   36    return so_far + static_cast<size_t>(v.rows()) * static_cast<size_t>(v.cols());
 
   42template <
typename T, 
int M, 
int N>
 
   45  typedef Eigen::Matrix<T, M, N> MatrixTMN;
 
   49    assert(_dims.size() == 2);
 
   52  inline T* transform_read(MatrixTMN& array) {
 
   53    if (_dims[0] != 
static_cast<size_t>(array.rows()) ||
 
   54        _dims[1] != 
static_cast<size_t>(array.cols())) {
 
   55      array.resize(
static_cast<typename MatrixTMN::Index
>(_dims[0]),
 
   56          static_cast<typename MatrixTMN::Index
>(_dims[1]));
 
   61  inline const T* transform_write(
const MatrixTMN& array) {
 
   65  inline void process_result(MatrixTMN&) {}
 
   67  std::vector<size_t> _dims;
 
 
   71template <
typename T, 
int M, 
int N>
 
   72inline void vectors_to_single_buffer(
const std::vector<Eigen::Matrix<T,M,N>>& vec,
 
   73                                     const std::vector<size_t>& dims,
 
   74                                     const size_t current_dim,
 
   75                                     std::vector<T>& buffer) {
 
   77  check_dimensions_vector(vec.size(), dims[current_dim], current_dim);
 
   78  for (
const auto& k : vec) {
 
   79    std::copy(k.data(), k.data() + k.size(), std::back_inserter(buffer));
 
   84template <
typename T, 
int M, 
int N>
 
   87  typedef Eigen::Matrix<T, M, N> MatrixTMN;
 
   91    assert(_dims.size() == 3);
 
   94  inline T * transform_read(std::vector<MatrixTMN>& ) {
 
   95    _vec_align.resize(compute_total_size(_space.getDimensions()));
 
   96    return _vec_align.data();
 
   99  inline const T* transform_write(
const std::vector<MatrixTMN>& vec) {
 
  100    _vec_align.reserve(compute_total_size(vec));
 
  101    vectors_to_single_buffer<T, M, N>(vec, _dims, 0, _vec_align);
 
  102    return _vec_align.data();
 
  105  inline void process_result(std::vector<MatrixTMN>& vec) {
 
  106    T* start = _vec_align.data();
 
  107    if (vec.size() > 0) {
 
  109        v = Eigen::Map<MatrixTMN>(start, v.rows(), v.cols());
 
  110        start += v.rows()*v.cols();
 
  113    else if (M == -1 || N == -1) {
 
  114      std::ostringstream ss;
 
  115      ss << 
"Dynamic size(-1) used without pre-defined vector data layout.\n" 
  116               << 
"Initiliaze vector elements using Zero, i.e.:\n" 
  117               << 
"\t vector<MatrixXd> vec(5, MatrixXd::Zero(20,5))";
 
  121      for (
size_t i = 0; i < _dims[0]; ++i) {
 
  122        vec.emplace_back(Eigen::Map<MatrixTMN>(start, M, N));
 
  128  std::vector<size_t> _dims;
 
  129  std::vector<typename inspector<T>::base_type> _vec_align;
 
 
  134template <
typename T, 
int M, 
int N, std::
size_t Dims>
 
  135struct data_converter<boost::multi_array<Eigen::Matrix<T, M, N>, Dims>, void> {
 
  136  typedef typename boost::multi_array<Eigen::Matrix<T, M, N>, Dims> MultiArrayEigen;
 
  139    : _dims(space.getDimensions())
 
  141    assert(_dims.size() == Dims + 2);
 
  144  inline T* transform_read(
const MultiArrayEigen& ) {
 
  145    _vec_align.resize(compute_total_size(_space.getDimensions()));
 
  146    return _vec_align.data();
 
  149  inline const T* transform_write(
const MultiArrayEigen& array) {
 
  150    _vec_align.reserve(compute_total_size(array));
 
  151    for (
auto e = array.origin(); e < array.origin() + array.num_elements(); ++e) {
 
  152      std::copy(e->data(), e->data() + e->size(), std::back_inserter(_vec_align));
 
  154    return _vec_align.data();
 
  157  inline void process_result(MultiArrayEigen& vec) {
 
  158    T* start = _vec_align.data();
 
  159    if (M != -1 && N != -1) {
 
  160      for (
auto v = vec.origin(); v < vec.origin() + vec.num_elements(); ++v) {
 
  161        *v = Eigen::Map<Eigen::Matrix<T, M, N>>(start, v->rows(), v->cols());
 
  162        start += v->rows() * v->cols();
 
  165      if (vec.origin()->rows() > 0 && vec.origin()->cols() > 0) {
 
  166        const auto VEC_M = vec.origin()->rows(), VEC_N = vec.origin()->cols();
 
  167        for (
auto v = vec.origin(); v < vec.origin() + vec.num_elements(); ++v) {
 
  168          assert(v->rows() == VEC_M && v->cols() == VEC_N);
 
  169          *v = Eigen::Map<Eigen::Matrix<T, M, N>>(start, VEC_M, VEC_N);
 
  170          start += VEC_M * VEC_N;
 
  173        throw DataSetException(
 
  174              "Dynamic size(-1) used without pre-defined multi_array data layout.\n" 
  175                    "Initialize vector elements using  MatrixXd::Zero");
 
  180  std::vector<size_t> _dims;
 
  181  const DataSpace& _space;
 
  182  std::vector<typename inspector<T>::base_type> _vec_align;
 
Exception specific to h5gt DataSet interface.
Definition H5Exception.hpp:115
Class representing the space (dimensions) of a dataset.
Definition H5DataSpace.hpp:37
std::vector< size_t > getDimensions() const
getDimensions
Definition H5Dataspace_misc.hpp:103
HDF5 Data Type.
Definition H5DataType.hpp:48
Definition H5Converter_misc.hpp:124