Eigen, 矩阵和向量

在Eigen中,所有矩阵和向量都是Matrix模板类的对象。向量只是矩阵的一种特殊情况,有1行或1列。

参见官网内容,以下内容为GOOGLE翻译出来的,最好参见官网内容。

C++矩阵库 Eigen 快速入门

Matrix的前三个模板参数

该矩阵类需要六个月模板参数,但现在它已经足够了解的前三个第一参数。其余三个参数都有默认值,现在大家将保持不变,大家将在下面讨论。

Matrix的三个必需模板参数是:

Matrix <typename Scalar,int RowsAtCompileTime,int ColsAtCompileTime>

Scalar是标量类型,即系数的类型。也就是说,如果你想要一个浮点矩阵,请选择float这里。有关所有支撑的标量类型的列表以及如何扩展对新类型的支撑,请参阅标量类型。

RowsAtCompileTime并且ColsAtCompileTime是编译时已知的矩阵的行数和列数(如果在编译时未知该数字,请参见下文)。

大家提供了很多方便的typedef来涵盖通常情况。例如,Matrix4f是浮动的4x4矩阵。以下是Eigen的定义:

typedef Matrix <float,4,4> Matrix4f ;

大家在下面讨论这些方便的typedef。

矢量

如上所述,在Eigen中,向量只是矩阵的一种特殊情况,具有1行或1列。他们有1列的情况是最常见的;?这种矢量称为列矢量,通常缩写为矢量。在他们有1行的另一种情况下,它们被称为行向量。

例如,便捷typedef?Vector3f是3个浮点数的(列)向量。它由Eigen定义如下:

typedef Matrix <float,3,1> Vector3f ;

大家还为行向量提供了方便的typedef,例如:

typedef Matrix <int,1,2> RowVector2i ;

特殊值动态

当然,Eigen不限于在编译时已知尺寸的矩阵。在RowsAtCompileTime和ColsAtCompileTime模板参数可以采取特殊值Dynamic这表明大小在编译时是未知的,所以必须作为运行时变量来处理。在本征术语中,这种大小称为动态?大小?;?而在编译时已知的大小称为固定?大小。例如,便捷typedef?MatrixXd,即具有动态大小的双精度矩阵,定义如下:

typedef Matrix <double,Dynamic,Dynamic> MatrixXd ;

同样,大家定义了一个不言自明的typedef?VectorXi如下:

typedef Matrix <int,Dynamic,1> VectorXi ;

您可以完美地拥有例如具有动态列数的固定行数,如下所示:

Matrix <float,3,Dynamic>

构造函数

默认构造函数始终可用,从不实行任何动态内存分配,也从不初始化矩阵系数。你可以做:

Matrix3f a;

MatrixXf b;

这里,

a?是一个3乘3的矩阵,具有未初始化系数的普通浮点数[9],

b?是一个动态大小的矩阵,其大小目前是0乘0,并且其系数数组尚未分配。

也可提供尺寸合同的建筑商。对于矩阵,始终首先传递行数。对于矢量,只需传递矢量大小。它们使用给定的大小分配系数数组,但不自行初始化系数:

MatrixXf a(10,15);

VectorXf b(30);

这里,

a?是一个10x15动态大小的矩阵,具有已分配但当前未初始化的系数。

b?是一个大小为30的动态大小向量,具有已分配但当前未初始化的系数。

为了在固定大小和动态大小的矩阵上提供统一的API,在固定大小的矩阵上使用这些构造函数是合法的,即使在这种情况下传递大小是无用的。所以这是合法的:

Matrix3f a(3,3);

并且是无操作的。

最后,大家还提供了一些构造函数来初始化大小为4的小型固定大小向量的系数:

Vector2d a(5.0,6.0);

Vector3d b(5.0,6.0,7.0);

Vector4d c(5.0,6.0,7.0,8.0);

系数访问器

Eigen中的主要系数访问器和增变器是重载的括号运算符。对于矩阵,行索引始终首先传递。对于向量,只需传递一个索引。编号从0开始。


逗号初始化

可以使用所谓的逗号初始化器语法方便地设置矩阵和向量系数。

调整

可以通过rows(),cols()和size()检索矩阵的当前大小。这些方法分别返回行数,列数和系数数。调整动态大小矩阵的大小由resize()方法完成。

分配和调整大小

推荐阅读更多精彩内容