Eigen, 矩阵和向量
在Eigen中,所有矩阵和向量都是Matrix模板类的对象。向量只是矩阵的一种特殊情况,有1行或1列。
参见官网内容,以下内容为谷歌翻译出来的,最好参见官网内容。
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);
系数访问器
Eigen中的主要系数访问器和增变器是重载的括号运算符。对于矩阵,行索引始终首先传递。对于向量,只需传递一个索引。编号从0开始。
逗号初始化
可以使用所谓的逗号初始化器语法方便地设置矩阵和向量系数。
调整
可以通过rows(),cols()和size()检索矩阵的当前大小。这些方法分别返回行数,列数和系数数。调整动态大小矩阵的大小由resize()方法完成。