`

Eigen中Map的高级用法

c++ 
阅读更多
Map类 是 矩阵库Eigen中用来将内存数据 映射为 任意形状的矩阵的类。
其基本用法参见:http://cherishlc.iteye.com/blog/1968238
Map的官方文档:http://eigen.tuxfamily.org/dox/group__TutorialMapClass.html
Stride类的官方文档:http://eigen.tuxfamily.org/dox/classEigen_1_1Stride.html

这里给出其最为灵活的用法的一个示例:
将一个矩阵的第一行copy到另一个矩阵(要是Eigen有reshape函数就不用这么麻烦了。。。别说,还真有!可以用resize代替~~)
先上结果:



附上代码:
#include <Eigen/Core>
#include <iomanip>
#include <iostream>

using std::setw;
#define printlnExp(exp) std::cout<<std::left<<setw(30)<<(std::string(#exp)+"  为:")<<std::endl<<(exp)
#define printlnExpln(exp) printlnExp(exp)<<std::endl

void main() {
    using namespace Eigen;
    MatrixXd m (4, 6);
    for (int i = 0; i < m.size(); ++i) {
        m (i) = i;
    }
    printlnExpln (m);
    MatrixXd msub (2, m.cols() / 2);
    //将 m 的第一行存入 msub中。  Stride 的第一个参数为OuterStride,对于按列优先存储的矩阵来说,就是 列与列之间指针的差值; 第二个参数为InnerStride,即两个相邻元素 指针之间的差值
    msub = Map<MatrixXd, 0, Stride<Dynamic, Dynamic> > (m.data(), msub.rows(), msub.cols(), Stride<Dynamic, Dynamic> (m.rows() * msub.rows(), m.rows() ) );
    printlnExpln (msub);


    //////////////////////////////////////////////////////////////////////////
    MatrixXd msub2 = m.row (0);
    msub2.resize (2, m.cols() / 2);//将resize函数作为reshape函数使用,可以达到同样的效果, 是不是觉着很爽啊~ 但是反过来,,,不可能用此方法去给m的第一行赋值
    printlnExpln (msub2);
    //////////////////////////////////////////////////////////////////////////

    //以下方法显然是错的。。。
    MatrixXd msub3 (2, m.cols() / 2);
    msub3 = m.row (0);
    printlnExpln (msub3) << std::endl;



    std::cout << "以下是测试将m的第一行置为msub中的相反数////////////" << std::endl << std::endl;
    m.row (0) = -MatrixXd::Map (msub.data(), 1, m.cols() );
    //m.row(0) = -Map<MatrixXd>(msub.data(), 1, m.cols());//这样写也行
    printlnExpln (m);
}
  • 大小: 13.6 KB
分享到:
评论

相关推荐

    eigen库使用教程,使用说明文档

    在实际应用中,我们常常需要根据具体需求调整代码。例如,在机器学习算法中,可能需要使用`Eigen::MatrixXd`来存储权重矩阵,使用`Eigen::VectorXd`来存储输入向量。在计算过程中,利用表达式模板可以编写出简洁高效...

    Eigen-从官网翻译的教程资料

    稀疏线性代数部分则探讨了处理大型稀疏矩阵的高效方式,而几何学部分则展示了Eigen库在几何计算中的应用。 Eigen库的API设计允许灵活地使用C++进行数学运算,使得数学计算和矩阵操作的代码既简洁又高效。它的设计...

    em_cpp_mapa:我使用 Eigen 和 Sam 的代码作为基础的 MAPA C++ 转换版本

    标题 "em_cpp_mapa" 指的是一项使用 C++ 实现的项目,它基于 Mauro Maggioni 和 Guangiang Chen 原始的 MATLAB 代码,并进行了转换以利用 Eigen 库和 Sam 提供的代码,特别是涉及 SVD(奇异值分解)的部分。...

    pybind11-master.zip

    在本篇中,我们将深入探讨Pybind11的核心概念、安装与配置、基本用法以及一些高级特性。 1. **核心概念** Pybind11的核心思想是提供一种类型安全、表达性强的方式来将C++函数和类暴露给Python。它通过模板元编程...

    Kinect获取点云数据+点云读取显示代码整合

    除了基本的点云数据获取和显示之外,还可以探索更多高级的应用场景,如目标检测与跟踪、三维重建、手势识别等。这些应用场景往往需要更加复杂的算法和技术支持,例如机器学习算法、深度学习网络等。 总之,Kinect...

    C++库介绍.pdf

    例如,`std::vector`、`std::map`、`std::string`和`std::iostream`等。其中,Dinkumware、RogueWave、SGI STL和STLport是不同实现的代表,各有优缺点。 2. **C++准标准库 Boost**:Boost是一个强大的库集合,包含...

    算法

    深入学习,C++中的STL(Standard Template Library,标准模板库)提供了许多数据结构,如vector、list、set、map等,这些数据结构配合`&lt;algorithm&gt;`中的函数,可以方便地实现各种高级算法。例如,优先队列(priority...

    cpp代码-数据分析软件 支持直接分析,也支持算加权

    在IT行业中,编程语言C++是一种广泛用于系统软件、应用软件、游戏开发、数据分析等多个领域的高级编程语言。本文将深入探讨标题和描述中提到的"cpp代码-数据分析软件",以及它如何支持直接分析和加权计算。 首先,...

    Math-Modeling-Code:2021数学模型分析源代码

    综上所述,这个"Math-Modeling-Code:2021数学模型分析源代码"的资源提供了2021年数学建模问题的C++实现,涵盖了从基本编程到高级应用的诸多方面,是学习和研究数学建模实践的好材料。通过深入研究这些代码,可以了解...

    POSN:POSN-BUU的源代码

    7. **第三方库**:C++生态系统中有许多优秀的第三方库,如Boost、Eigen(用于线性代数计算)、Google Protocol Buffers(用于数据序列化)等,POSN-BUU可能依赖其中的一些进行开发。 8. **编译与构建工具**:项目...

Global site tag (gtag.js) - Google Analytics