2012-10-12 9 views
5

Próbuję serializować matrycę Eigen. Tak, że mogę serializować bardziej złożony obiekt. Używam Matrix jako klasy bazowej i obejmują serializację w klasie pochodnej. Nie mam pojęcia, jak adresować Matrix.data(), która zwraca tablicę w stylu c (jeśli mam rację). To moja próba:serializowanie matrycy Eigen za pomocą boost.serialization

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

Chciałbym używać go jako "owinięcie":

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

zamiast

Matrix<double,3,1> vector; 
+0

do serializacji, użyłem http://www.boost.org/doc/libs/1_51_0/libs/serialization/doc/index.html –

Odpowiedz

8

Poprzez umieszczenie następujące bezpłatne funkcję do swojej Kompilacja, możesz efektywnie uczynić Boost.Serialization świadomym jak serializować typy 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]; 
    } 
} 

Na przykład dałeś, powinieneś być w stanie zrobić (niesprawdzone):

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

Zapraszamy do obejrzenia mojego previous answer na serializacji typów EIGEN korzystających Boost.Serialization bardziej szczegółowym przykładzie.

+1

Czy nie ma sensu pisać serializacji dla 'Eigen :: DenseBase'? Myślę, że w ten sposób można również serializować "Eigen :: Array" z tym samym kodem, zobacz: http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html –