Nak*_*amp 3 c++ serialization eigen c++11 cereal
更新:我用谷歌搜索并在代码中读取doxygen注释后设法让它工作.问题是我在使用resize()方法之前错过了演员,也没有std::ios::binary用于流.如果你想做类似的事情,最好检查Azoth的答案.
我正在尝试Eigen::Matrix使用Cereal 序列化类型.这就是我所拥有的(松散地基于https://gist.github.com/mtao/5798888和其中的类型cereal/types):
#include <cereal/cereal.hpp>
#include <cereal/archives/binary.hpp>
#include <Eigen/Dense>
#include <fstream>
namespace cereal
{
template <class Archive, class _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> inline
typename std::enable_if<traits::is_output_serializable<BinaryData<_Scalar>, Archive>::value, void>::type
save(Archive & ar, Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> const & m)
{
int rows = m.rows();
int cols = m.cols();
ar(make_size_tag(static_cast<size_type>(rows * cols)));
ar(rows);
ar(cols);
ar(binary_data(m.data(), rows * cols * sizeof(_Scalar)));
}
template <class Archive, class _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> inline
typename std::enable_if<traits::is_input_serializable<BinaryData<_Scalar>, Archive>::value, void>::type
load(Archive & ar, Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> const & m)
{
size_type size;
ar(make_size_tag(size));
int rows;
int cols;
ar(rows);
ar(cols);
const_cast<Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> &>(m).resize(rows, cols);
ar(binary_data(const_cast<_Scalar *>(m.data()), static_cast<std::size_t>(size * sizeof(_Scalar))));
}
}
int main() {
Eigen::MatrixXd test = Eigen::MatrixXd::Random(10, 3);
std::ofstream out = std::ofstream("eigen.cereal", std::ios::binary);
cereal::BinaryOutputArchive archive_o(out);
archive_o(test);
std::cout << "test:" << std::endl << test << std::endl;
out.close();
Eigen::MatrixXd test_loaded;
std::ifstream in = std::ifstream("eigen.cereal", std::ios::binary);
cereal::BinaryInputArchive archive_i(in);
archive_i(test_loaded);
std::cout << "test loaded:" << std::endl << test_loaded << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
Azo*_*oth 10
您的代码几乎是正确的,但有一些错误:
您不需要生成,size_tag因为您明确地序列化行数和列数.通常谷物size_tag用于可调整大小的容器,如载体或列表.即使矩阵可以调整大小,仅仅明确地序列化行和列也更有意义.
std::ofstream对象一起使用std::ofstream谷物档案(二进制档案库将立即清除其内容,但一般情况下谷物档案只能保证在销毁时清除其内容)这是一个在g ++和clang ++下编译并生成正确输出的版本:
#include <cereal/cereal.hpp>
#include <cereal/archives/binary.hpp>
#include <Eigen/Dense>
#include <fstream>
namespace cereal
{
template <class Archive, class _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> inline
typename std::enable_if<traits::is_output_serializable<BinaryData<_Scalar>, Archive>::value, void>::type
save(Archive & ar, Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> const & m)
{
int32_t rows = m.rows();
int32_t cols = m.cols();
ar(rows);
ar(cols);
ar(binary_data(m.data(), rows * cols * sizeof(_Scalar)));
}
template <class Archive, class _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> inline
typename std::enable_if<traits::is_input_serializable<BinaryData<_Scalar>, Archive>::value, void>::type
load(Archive & ar, Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> & m)
{
int32_t rows;
int32_t cols;
ar(rows);
ar(cols);
m.resize(rows, cols);
ar(binary_data(m.data(), static_cast<std::size_t>(rows * cols * sizeof(_Scalar))));
}
}
int main() {
Eigen::MatrixXd test = Eigen::MatrixXd::Random(10, 3);
{
std::ofstream out("eigen.cereal", std::ios::binary);
cereal::BinaryOutputArchive archive_o(out);
archive_o(test);
}
std::cout << "test:" << std::endl << test << std::endl;
Eigen::MatrixXd test_loaded;
{
std::ifstream in("eigen.cereal", std::ios::binary);
cereal::BinaryInputArchive archive_i(in);
archive_i(test_loaded);
}
std::cout << "test loaded:" << std::endl << test_loaded << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |