- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我尝试编写一个通用的序列化函数,它接受任何密集矩阵并将其序列化:其他一些有帮助但还没有结束的问题在这里: Question1 Question2
我尝试了以下应该有效的方法:
namespace boost {
namespace serialization {
template<class Archive, typename Derived> void serialize(Archive & ar, Eigen::EigenBase<Derived> & g, const unsigned int version)
{
ar & boost::serialization::make_array(g.derived().data(), g.size());
}
}; // namespace serialization
}; // namespace boost
当我尝试序列化 Eigen::Matrix<double,4,4>
时
Eigen::Matrix<double,4,4> a;
boost::serialize(ar, a);
编译器会不会匹配上面的模板?并给出以下错误:
/usr/local/include/boost/serialization/access.hpp|118|错误:“class Eigen::Matrix”没有名为“serialize”的成员|
最佳答案
我已经测试了你的代码,但当我试图编译它时它也没有工作。但是,根据 Boost Serialize 的文档,我的印象是它旨在与流运算符 << 一起使用。以下代码对我来说工作正常:
namespace boost {
namespace serialization {
template <class Archive, typename Derived>
void serialize( Archive & ar, Eigen::EigenBase<Derived> & g, const unsigned int version){
ar & boost::serialization::make_array(g.derived().data(), g.size());
}
}
}
int main (int argc, char* argv[]){
std::ofstream out("my_archive");
boost::archive::text_oarchive oa (out);
Eigen::Matrix <double, 4, 4> a;
out << a;
return 0;
}
文件 my_archive 是在工作文件夹中创建的,具有非零值(只是内存中未初始化的垃圾,带有上述过度简化的代码)。
编辑:我尝试在我自己的应用程序中使用上面的确切代码,发现我收到了与您相同的错误。老实说,我现在不明白为什么会这样。我找到的最简单的修复方法是替换 Eigen::EigenBase<Derived>
使用实际的 Matrix 类型。我正在使用的当前代码是:
namespace boost{
namespace serialization {
template <class Archive, typename Scalar>
void serialize ( Archive & ar, Eigen::Matrix<Scalar, -1, -1, 0, -1, -1> & g, const unsigned int version ){ /* ... */ }
}
}
以上代码适用于任何标量类型(float、double、int)和动态/运行时大小的矩阵。对于静态尺寸,检查并相应地更新模板参数。
编辑 #2(2014 年 4 月 9 日):
尽管上面的代码看起来可以工作,但当我试图将它完全集成到我的代码中并通过适当的单元测试对其进行练习时,它停止了工作。不幸的是,我收到的错误消息——来自 Visual Studio 和 clang——最没有帮助。幸运的是,gcc 隐藏在可怕的错误消息中,引用了 CV 不匹配,这似乎让我能够完全解决这个问题。
下面的代码现在似乎可以成功编译和运行。我试图使格式清晰易读(无需横向滚动)——希望下面的代码是清晰的:
namespace boost{
namespace serialization{
template< class Archive,
class S,
int Rows_,
int Cols_,
int Ops_,
int MaxRows_,
int MaxCols_>
inline void save(
Archive & ar,
const Eigen::Matrix<S, Rows_, Cols_, Ops_, MaxRows_, MaxCols_> & g,
const unsigned int version)
{
int rows = g.rows();
int cols = g.cols();
ar & rows;
ar & cols;
ar & boost::serialization::make_array(g.data(), rows * cols);
}
template< class Archive,
class S,
int Rows_,
int Cols_,
int Ops_,
int MaxRows_,
int MaxCols_>
inline void load(
Archive & ar,
Eigen::Matrix<S, Rows_, Cols_, Ops_, MaxRows_, MaxCols_> & g,
const unsigned int version)
{
int rows, cols;
ar & rows;
ar & cols;
g.resize(rows, cols);
ar & boost::serialization::make_array(g.data(), rows * cols);
}
template< class Archive,
class S,
int Rows_,
int Cols_,
int Ops_,
int MaxRows_,
int MaxCols_>
inline void serialize(
Archive & ar,
Eigen::Matrix<S, Rows_, Cols_, Ops_, MaxRows_, MaxCols_> & g,
const unsigned int version)
{
split_free(ar, g, version);
}
} // namespace serialization
} // namespace boost
上面代码的几个关键点:
此代码现在具有所有 Eigen 矩阵参数的模板化参数。这应该允许它处理所有类型的矩阵和 vector ,无论大小是在编译时还是运行时。这是对上述代码的重大改进
必须将序列化代码拆分为单独的保存 和加载 函数。否则,反序列化代码不会调整矩阵的大小来保存原始数据。我相信 Boost::Serialize 确实提供了一些额外的函数,可以重载这些函数来执行序列化或反序列化操作,但这种方法更容易实现。
save
上的 const 限定符方法必不可少。在一个模糊的 g++ 错误让我意识到这一点之前,这就是我遇到麻烦的根源。
我还不能说我已经对这段代码进行了全面的压力测试。如果您(或其他任何人)发现任何其他问题,请务必告诉我,我会尽力跟进我发现的任何其他问题。
相信这会有所帮助。
什穆尔
关于c++ - Eigen 和 boost::serialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382457/
我正在尝试使用boost.spirit的qi库解析某些内容,而我遇到了一个问题。根据spirit docs,a >> b应该产生类型为tuple的东西。但这是boost::tuple(又名 fusio
似乎有/正在努力做到这一点,但到目前为止我看到的大多数资源要么已经过时(带有死链接),要么几乎没有信息来实际构建一个小的工作样本(例如,依赖于boost program_options 以构建可执行文
我对 Boost.Log 的状态有点困惑。这是 Boost 的官方部分,还是尚未被接受?当我用谷歌搜索时,我看到一些帖子谈论它在 2010 年是如何被接受的,等等,但是当我查看最后一个 Boost 库
Boost 提供了两种不同的实现 string_view ,这将成为 C++17 的一部分: boost::string_ref在 utility/string_ref.hpp boost::stri
最近,我被一家GIS公司雇用来重写他们的旧地理信息库。所以我目前正在寻找一个好的计算几何库。我看过CGAL,这真是了不起,但是我的老板想要免费的东西。 所以我现在正在检查Boost.Geometry。
假设我有一个无向图 G。假设我添加以下内容 add_edge(1,2,G); add_edge(1,3,G); add_edge(0,2,G); 现在我再说一遍: add_edge(0,2,G); 我
我使用 CMake 来查找 Boost。找到了 Boost,但 CMake 出错了 Imported targets not available for Boost version 请参阅下面的完整错
我是 boost::fusion 和 boost::mpl 库的新手。谁能告诉我这两个库之间的主要区别? 到目前为止,我只使用 fusion::vector 和其他一些简单的东西。现在我想使用 fus
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: What are the benefits of using Boost.Phoenix? 所以我开始阅读 boos
我正在尝试获得一个使用 Boost.Timer 的简单示例,用于一些秒表性能测量,但我不明白为什么我无法成功地将 Boost.Timer 链接到 Boost.Chrono。我使用以下简单脚本从源代码构
我有这样的东西: enum EFood{ eMeat, eFruit }; class Food{ }; class Meat: public Food{ void someM
有人可以告诉我,我如何获得boost::Variant处理无序地图? typedef boost::variant lut_value;unordered_map table; 我认为有一个用于boo
我对 Boost.Geometry 中的环和多边形感到困惑。 在文档中,没有图形显示什么是环,什么是多边形。 谁能画图解释两个概念的区别? 最佳答案 在 Boost.Geometry 中,多边形被定义
我正在使用 boost.pool,但我不知道何时使用 boost::pool<>::malloc和 boost::pool<>::ordered_malloc ? 所以, boost::pool<>:
我正在尝试通过 *boost::fast_pool_allocator* 使用 *boost::container::flat_set*。但是,我收到编译错误。非常感谢您的意见和建议。为了突出这个问题
sau_timer::sau_timer(int secs, timerparam f) : strnd(io), t(io, boost::posix_time::seconds(secs)
我无法理解此功能的文档,我已多次看到以下内容 tie (ei,ei_end) = out_edges(*(vi+a),g); **g**::out_edge_iterator ei, ei_end;
我想在 C++ 中序列化分层数据结构。我正在处理的项目使用 boost,所以我使用 boost::property_tree::ptree 作为我的数据节点结构。 我们有像 Person 这样的高级结
我需要一些帮助来解决这个异常,我正在实现一个 NPAPI 插件,以便能够使用来自浏览器扩展的本地套接字,为此我正在使用 Firebreath 框架。 对于套接字和连接,我使用带有异步调用的 Boost
我尝试将 boost::bind 与 boost::factory 结合使用但没有成功 我有这个类 Zambas 有 4 个参数(2 个字符串和 2 个整数)和 class Zambas { publ
我是一名优秀的程序员,十分优秀!