在Eigen中,所有矩阵和向量均为Matrix模板类的对象,向量是矩阵的行(或列)为1是的特殊情况。
1、矩阵的三参数模板
Matrix类有六个模板参数,其中三个有默认值,因此只要学习三个参数就足够了。强制性的三参数模板的原型为:
Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
三个参数分别表示:标量的类型,编译时的行,编译时的列。
用typedef
定义了很多模板,例如:Matrix4f
表示
4×4
的floats 矩阵:
typedef Matrix<float, 4, 4> Matrix4f;
2、向量(Vectors)
向量是矩阵的特殊情况,也是用矩阵定义的。定义如下:
typedef Matrix<float, 3, 1> Vector3f;
typedef Matrix<int, 1, 2> RowVector2i;
3、特殊动态值(special value Dynamic)
Eigen的矩阵不仅能够在编译是确定大小(fixed size),也可以在运行时确定大小,就是所说的动态矩阵(dynamic size)。动态矩阵定义如下:
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
typedef Matrix<int, Dynamic, 1> VectorXi;
也可使用‘行’固定‘列’动态的矩阵:
Matrix<float, 3, Dynamic>
4、构造函数(Constructors)
可以使用默认的构造函数,不执行动态分配内存,也没有初始化矩阵参数:
Matrix3f a;
MatrixXf b;
- a 是3-by-3矩阵,包含未初始化的 float[9] 数组
- b是动态矩阵,当前大小为 0-by-0, 没有为数组的系数分配内存
矩阵的第一个参数表示“行”,数组只有一个参数。根据跟定的大小分配内存,但不初始化。
MatrixXf a(10,15);
VectorXf b(30);
- a 是10-by-15阵,分配了内存,没有初始化
- b是动态矩阵,当前大小为 30, 分配了内存,没有初始化
对于给定的矩阵,传递的参数无效,如:
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);
5、系数访问
系数都是从0开始:
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
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);
std::cout << "Here is the matrix m:\n" << m << std::endl;
VectorXd v(2);
v(0) = 4;
v(1) = v(0) - 1;
std::cout << "Here is the vector v:\n" << v << std::endl;
}
矩阵默认按列存储。
operator[] 在 vectors 中重载。matrix[i,j]和matrix[j]含义相同。
6、逗号分隔的初始化
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
7、Resizing
可以用rows(), cols() and size() 改变现有矩阵的大小。这些类方法返回行、列、系数的数值。也可以用resize()来改变动态矩阵的大小。