在Eigen中,所有矩阵和向量都是Matrix模板类的对象。向量只是矩阵的一种特殊情况,具有 1 行或 1 列。
1、矩阵声明
//double类型2x3固定矩阵,编译时行列数已知
Eigen::Matrix<double, 2, 3> A;
//double类型3x3矩阵
Eigen::Matrix3d A;
//double类型3维向量
Eigen::Vector3d vec;
//动态大小矩阵,编译时行列数未知
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> A;
//可简写为
Eigen::MatrixXd A;
Eigen::MatrixXd A(3, 3);
2、访问矩阵元素
A(i, j) //i j 下标从0开始
- A(i, j)既可作为左值,也可作为右值;
- 向量可通过 () 或 [ ] 访问元素;
- 矩阵只能通过 () 访问元素,因为 [i , j] 会被认为是逗号表达式。
3、矩阵元素赋值
A << 1, 2, 3, 4;
4、矩阵块操作
//从(i, j)开始,每行取 p 个,每列取 q 个,返回一个临时新矩阵
A.block(i, j, p, q);
//从(i, j)开始取一个 p 行 q 列的子矩阵并返回
A.block<p, q>(i j);
5、向量操作
向量的定义如下:
//列向量
typedef Matrix<float, 3, 1> Vector3f;
//行向量
typedef Matrix<int, 1, 2> RowVector2i;
vec.head(n); //前n个元素
vec.tail(n); //后n个元素
vec.segment(1, n); //从下标 i 开始,截取 n 个元素
6、高级初始化
Eigen::Matrix3f A;
A = Eigen::Matrix3f::Zero(); //全0
A = Eigen::Matrix3f::Ones(); //全1
A = Eigen::Matrix3f::Constant(val); //全val
A = Eigen::Matrix3f::Identity(); //单位矩阵
A = Eigen::Matrix3f::Random(); //随机数值