Eigen库的使用

1.Matrix类:

定义:Matrix<类型, 行, 列>

Eigen库的使用

 eigen库中封装好了一些常用的矩阵,例如:

typedef Matrix<float, 4, 4> Matrix4f;

当然我们也可以自己设置,矩阵的行和列可以设置为固定的值也可以设置动态的(Dynamic),小的尺寸用固定的,大的尺寸用动态的,使用固定尺寸可以避免动态内存的开辟。

1)初始化方式

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
std::cout << m;

 通过中括号获取元素,对于矩阵是:(行,列);对于向量,只是传递它的索引,以0为起始。

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

 

2)矩阵的属性

矩阵的行,列,大小

cout<<"行: "<<m.cols()<<" 列: "<<m.rows()<<" 大小: "<<m.size();

3)resize()

只用行和列是动态参数的时候才可以使用,否则会报错,而且输入的时候编译器会检查。

    m.resize(2,3);
    cout<<m<<endl;
    cout<<"行: "<<m.cols()<<" 列: "<<m.rows()<<" 大小: "<<m.size()<<endl;

assignment(分配)是复制一个矩阵到另外一个,操作符=。Eigen会自动resize左变量大小等于右变量大小,比如:

MatrixXf a(2,2);
std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl;
MatrixXf b(3,3);
a = b;
std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl;

 

 4)构造函数

默认的构造函数不执行任何空间分配,也不初始化矩阵的元素。

Matrix3f a;
MatrixXf b;

指定大小的矩阵,只是分配相应大小的空间,未初始化元素。

MatrixXf a(10,15);
VectorXf b(30);

为了对固定大小和动态大小的矩阵提供统一的API,对指定大小的Matrix传递sizes也是合法的(传递也被忽略)。

Matrix3f a(3,3);

可以用构造函数提供4以内尺寸的vector的初始化。

Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);

5)其他模板参数

Matrix<typename Scalar,
       int RowsAtCompileTime,
       int ColsAtCompileTime,
       int Options = 0,
       int MaxRowsAtCompileTime = RowsAtCompileTime,
       int MaxColsAtCompileTime = ColsAtCompileTime>

Options是一个比特标志位,这里,我们只介绍一种RowMajor,它表明matrix使用按行存储,默认是按列存储。Matrix<float, 3, 3, RowMajor>   ,MaxRowsAtCompileTime和MaxColsAtCompileTime表示在编译阶段矩阵的上限。主要是避免动态内存分配。

Matrix<float, Dynamic, Dynamic, 0, 3, 4>

6)矩阵的+、-、数×、乘法

左右两侧变量具有相同的尺寸(行和列),并且元素类型相同(Eigen不自动转化类型),其运算和int,float等基本类型相同。

#include <Eigen/Core>
#include<Eigen/Dense>
#include<iostream>
using namespace std;
using namespace Eigen;
int main()
{
    Matrix2d m(2,2);
    m(0,0)=-1;
    m(0,1)=0;
    m(1,0)=0;
    m(1,1)=1;
    Vector2d v1(1,2),v2(2,3);


    cout<<m*v1<<endl;

    cout<<m*v2<<endl;
    cout<<v1.transpose()*v2<<endl;

    return 0;
}

7)点×和叉×

使用dot() and cross()

    Vector3d v(3,4,5);
    Vector3d w(0,2,3);
    cout<<v.dot(w)<<endl;
    cout<<v.cross(w)<<endl;
   return 0;

8)转置、共轭、伴随

Eigen库的使用 表示transpose转置

Eigen库的使用 表示conjugate共轭

Eigen库的使用 表示adjoint(共轭转置) 伴随矩阵

MatrixXcf a = MatrixXcf::Random(2,2);
cout << "Here is the matrix a\n" << a << endl;
cout << "Here is the matrix a^T\n" << a.transpose() << endl;
cout << "Here is the conjugate of a\n" << a.conjugate() << endl;
cout << "Here is the matrix a^*\n" << a.adjoint() << endl;

 transpose和adjoint会简单的返回一个代理对象并不对本省做转置。如果执行 b=a.transpose() ,a不变,转置结果被赋值给b。如果执行 a=a.transpose() Eigen在转置结束之前结果会开始写入a,所以a的最终结果不一定等于a的转置。

a = a.transpose();,如果要就地转置a.transposeInPlace();

Matrix2i a; a << 1, 2, 3, 4;
cout << "Here is the matrix a:\n" << a << endl;
a = a.transpose(); // !!! do NOT do this !!!
cout << "and the result of the aliasing effect:\n" << a << endl;

Here is the matrix a:
1 2
3 4
and the result of the aliasing effect:
1 2
2 4

9)

上一篇:作业0:虚拟机的使用


下一篇:利用Eigen库计算点到三维平面的投影点