`

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics