Eigen快速入门

Eigen快速入门

一个简单的例子

#include <iostream>
#include "Eigen/Dense"

using namespace std;
using Eigen::MatrixXd;


void fun0()
{
      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);
      cout<<m<<endl;
}
  • Eigen头文件定义了许多类型,对于简单的应用来说使用MatrixXd就足够
  • 它代表任意大小的矩阵,X代表此意,其中的每一个元素都是double
  • 参照快速参考指引查看其它类型
  • Eigen/Dense头文件中包含了MatrixXd中所有成员函数的定义和相关类型
  • 定义在该头文件中的所有类和函数,还有其它头文件中的,都位于Eigen命名空间
  • 第一行声明MatrixXd变量,并指明行数和列数,元素没有被初始化
  • 设置左上角元素为3,你需要小括号来引用该元素
  • 索引都是从0开始
  • 紧接着三行设置其它三个值,最后输出该矩阵

Dense头文件中包含的内容:

#include "Core"
#include "LU"
#include "Cholesky"
#include "QR"
#include "SVD"
#include "Geometry"
#include "Eigenvalues"

矩阵个向量

运行时设置大小

void fun1()
{
    MatrixXd m=MatrixXd::Random(3,3);
    m=(m+MatrixXd::Constant(3,3,1.2))*50;
    cout<<"m="<<endl;
    cout<<m<<endl;
    Eigen::VectorXd v(3);
    v<<1,2,3;
    cout<<"v:"<<endl;
    cout<<v<<endl;
    cout<<"m*v="<<endl<<m*v<<endl;

}
  • 这个例子声明了一个3*3的矩阵,并且使用Random()进行初始化
  • 第二行使用现行变换将值限制在10到110之间
  • MatrixXd::Constant(3,3,1.2)生成一个3*3的矩阵,所有元素都是1.2
  • 引入了一个新的类型,VectorXd,代表任意大小的向量,它声明包含三个元素,没有初始化
  • 使用都好初始化器进行初始化
  • 矩阵m和向量v相乘并输出结果

编译时设置大小


void fun2()
{
    Eigen::Matrix3d m=Eigen::Matrix3d::Random();
    m=(m+Eigen::Matrix3d::Constant(1.2))*50;
    cout<<"m="<<endl;
    cout<<m<<endl;
    Eigen::Vector3d v(1,2,3);
    cout<<"v:"<<endl;
    cout<<v<<endl;
    cout<<"m*v="<<endl<<m*v<<endl;
}
  • 这个版本和上一个类似,只是使用Matrix3d代表固定大小的矩阵
  • 它本身就代表这指定大小,所以构造函数中不需要指定大小
  • 类似我们使用Vector3d来代替VectorXd

两种情况对比

  • 固定大小的矩阵和向量具有两大优势
  • 编译器释放出更快的代码,因为它知道矩阵和向量的大小
  • 指定大小会在编译时候进行严格的检验,例如 Matrix4d 和Vector3d相乘,编译器会报错
  • 然而,使用许多类型会增加编译时间,和可执行应用的大小。而且,在编译时候矩阵大小有可能还不确定。
  • 根据经验,对于4*4或者更小的矩阵使用固定大小的类型

猜你喜欢

转载自blog.csdn.net/sn_gis/article/details/79009006