C++ Eigen 库教程

  技术

参见:

https://blog.csdn.net/hongge_smile/article/details/107296658

https://github.com/qixianyu-buaa/EigenChineseDocument/tree/master/Eigen/Chapter1_DenseMatrixAndArrary

如何添加Eigen库

在CMakeLists.txt添加如下内容

find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})

然后在.cpp文件中添加include语句

#include <Eigen/Dense>

默认情况下,使用eigen库需要写成:

Eigen::MatrixXd

如果要去掉Eigen::,则需要添加语句

using namespace Eigen;

定义矩阵

以2*2矩阵为例,定义一个2*2的eigen矩阵,并指定其内容

Eigen::MatrixXd m(2,2);
m(0,0)=3;
m(1,0)=2.5;
m(0,1)=-1;
m(1,1)=m(1,0)+m(0,1);

生成随机3*3矩阵

MatrixXd m1 = MatrixXd::Random(3,3);

生成全为1的3*3矩阵

MatrixXd m2 = MatrixXd::Constant(3,3,1); 

或者

MatrixXd m2 = MatrixXd::Ones(3,3); 

生成零矩阵(以3*3为例)

Matrix3d m3 = Matrix3d::Zero();

或者

MatrixXd m3 = MatrixXd::Zero(3,3);

生成单位矩阵

MatrixXd m4 = MatrixXd::Identity(6,6); 

生成向量(3D), << , 是逗号初始化

VectorXd v(3);
v << 1,2,3;

矩阵运算

矩阵乘法

m1*v

或者用点乘的语句

m1.dot(v)

矩阵转置

m.transpose()

m.transposeInPlace

两个向量叉乘

v1.cross(v2)

矩阵范数

括号内为空默认二范数,无穷范数括号内是Infinity

v.norm()

逆矩阵

m1.inverse()

Matrix 和 Vector 相互转换

Matrix 转 Vector

将Matrix的某列转为Vector

注意: Eigen是以0开始,作为第一列/行

    MatrixXd m(2,2);
    m(0,0)=3;
    m(1,0)=2.5;
    m(0,1)=-1;
    m(1,1)=m(1,0)+m(0,1);

    //Method1
    Vector2d mc1 = m.col(0);
    //Method2
    Vector2d mc1(Map<Vector2d>(m.col(0).data()));
    //Method3
    Map<VectorXd> mc2(m.col(1).data(), m.col(1).size());

将多个vector转为Matrix,水平排列

    Matrix2d MC(2,2);
    //Method1
    MC << mc1,mc2;
    //Method2
    MC << Map<MatrixXd>(mc1.data(),2,1),Map<MatrixXd>(mc2.data(),2,1);

如果需要垂直排列

MC << mr1,
      mr2;