сериализация матрицы Эйгена с использованием boost.serialization

Я пытаюсь сериализовать матрицу Эйгена. Так что я могу сериализовать более сложный объект. Я использую Matrix в качестве базового класса и включаю сериализацию в производный класс. Я не понимаю, как обратиться к Matrix.data(), который возвращает массив в стиле c (если я прав). Это моя попытка:

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

template < class TEigenMatrix>
class VariableType : public TEigenMatrix {
private:
  friend class boost::serialization::access;
  template<class Archive>
  void serialize(Archive & ar, const unsigned int version)
  {
      ar & this.data();
  }
public:
};

Я хотел бы использовать его как «обертку»:

VariableType<Matrix<double,3,1>> serializableVector;

на месте

Matrix<double,3,1> vector;

person kirill_igum    schedule 12.10.2012    source источник
comment
для сериализации я использовал boost.org/doc/libs /1_51_0/libs/serialization/doc/index.html   -  person kirill_igum    schedule 12.10.2012


Ответы (2)


Поместив следующую бесплатную функцию в вашу единицу компиляции, вы эффективно информируете Boost.Serialization о том, как сериализовать типы Eigen:

namespace boost
{
    template<class Archive, typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
    inline void serialize(
        Archive & ar, 
        Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> & t, 
        const unsigned int file_version
    ) 
    {
        for(size_t i=0; i<t.size(); i++)
            ar & t.data()[i];
    }
}

В приведенном вами примере вы должны быть в состоянии сделать (непроверенный):

void serialize(Archive & ar, const unsigned int version)
{
    ar & *this;
}

Взгляните на мой предыдущий ответ о сериализации типов Eigen с использованием Boost.Serialization для более подробного примера.

person Jakob    schedule 17.10.2012
comment
Разве не имеет смысла написать сериализацию для Eigen::DenseBase? Я думаю, что таким же образом можно сериализовать Eigen::Array с тем же кодом, см.: eigen.tuxfamily.org /dox/TopicFunctionTakingEigenTypes.html - person Robert Rüger; 19.02.2013

Поскольку матрица в Eigen плотная, вы можете заменить цикл for в ответе Якоба на make_array как:

ar & boost::serialization::make_array(t.data(), t.size());

Я дал более подробный ответ в этом сообщении: https://stackoverflow.com/a/23407209/1686769

person iNFINITEi    schedule 26.12.2012