Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

serializing Eigen's Matrix using boost.serialization

I'm trying to serialize Eigen's matrix. So that I can serialize a more complex object. I'm using Matrix as a base class and include the serialization in the derived class. I'm confused on how to address Matrix.data(), which returns a c-style array (if i'm correct). This is my attempt:

#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:
};

I would like to use it as a "wrapper" :

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

in place of

Matrix<double,3,1> vector;
like image 379
kirill_igum Avatar asked Oct 12 '12 01:10

kirill_igum


2 Answers

Since Matrix in Eigen are dense, so you can replace the for-loop in Jakob's answer with make_array as:

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

I made a more detailed answer in this post: https://stackoverflow.com/a/23407209/1686769

like image 163
iNFINITEi Avatar answered Oct 06 '22 11:10

iNFINITEi


By placing the following free function into your compilation unit, you effectively make Boost.Serialization aware of how to serialize Eigen types:

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];
    }
}

In the example you gave, you should then be able to do (untested):

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

Have a look at my previous answer on serialization of Eigen types using Boost.Serialization for a more detailed example.

like image 36
Jakob Avatar answered Oct 06 '22 12:10

Jakob