x
Eigen 矩阵
Matrix类 定义
1 | Matrix<typename Scalar, |
- Scalar 元素类型
- RowsAtCompileTime 行
- ColsAtCompileTime 列
- Options 比特标志位
- MaxRowsAtCompileTime和MaxColsAtCompileTime表示在编译阶段矩阵的上限。
Eigen的使用在官网上有详细的介绍,这里对我学习过程中用到的基本操作进行介绍。首先是矩阵的定义。 在矩阵类的模板参数共有6个。一般情况下我们只需要关注前三个参数即可。前三个模板参数如下所示:
1 Matrix<typename Scalar,int RowsAtCompileTime,int ColsAtCompileTime>
- Scalar参数为矩阵元素的类型,该参数可以是int,float,double等。
- RowsAtCompileTime和ColsAtCompileTime是矩阵的行数和列数。
Eigen 常用类型
1 | typedef Matrix< std::complex<double> , 2 , 2 > Matrix2cd |
矩阵构建
经过上面的介绍以后,我们应该能定义一些基本的矩阵了。如:
1 | Matrix3f a; //定义一个float类型3×3固定矩阵a |
对应动态矩阵,我们也可以在构造的时候给出矩阵所占用的空间,比如:
1 | MatrixXf a(10,15); //定义float类型10×15动态矩阵 |
为了保持一致性,我们也可以使用上面构造函数的形式定义一个固定的矩阵,即Matrix3f a(3,3)
也是允许的。
上面矩阵在构造的过程中并没有初始化,Eigen还为一些小的(列)向量提供了可以初始化的构造函数。如:
1 | Vector2d a(5.0,6.0); |
矩阵元素访问
Eigen提供了矩阵元素的访问形式和matlab中矩阵的访问形式非常相似,最大的不同是matlab中元素从1开始,而Eigen的矩阵中元素是从0开始访问。对于矩阵,第一个参数为行索引,第二个参数为列索引。而对于向量只需要给出一个索引即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <iostream>
#include "Eigen\Core"
//import most common Eigen types
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<<"Hear 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;
}输出结果如下:
1
2
3
4
5
6 Hear is the matrix m:
3 -1
2.5 1.5
Here is the vector v:
4
3像
m(index)
这种访问形式并不仅限于向量之中,对于矩阵也可以这样访问。这一点和matlab相同,我们知道在matlab中定义一个矩阵a(3,4),如果我访问a(5)相当于访问a(2,2),这是因为在matlab中矩阵是按列存储的。这里比较灵活,默认矩阵元素也是按列存储的,但是我们也可以通过矩阵模板构造参数Options=RowMajor改变存储方式(这个参数是我们还没有提到的矩阵构造参数的第4个参数)。
矩阵的逗号初始化
块操作
块是matrix
或array
中的矩形子块。
1 | // 方法1 |
matrix.row(i)
: 矩阵第i行matrix.col(j)
: 矩阵第j列- 角相关操作
operater | dynamic-size block | fixed_size block |
---|---|---|
左上角 | matrix.topLeftCorner(p,q) | matrix.topLeftCorner<p,q>() |
左下角 | matrix.bottomLeftCorner(p,q) | matrix.bottomLeftCorner<p,q>() |
右上角 | matrix.topRightCorner(p,q) | matrix.topRightCorner<p,q>() |
右下角 | 你猜 | 你猜 |
前q行 | matrix.topRows(q) | matrix.topRows() |
后q行 | matrix.bottomRows(q) | matrix.bottomRows() |
() | | 右p列 | matrix.rightCols(p) | matrix.rightCols
() |
Vector
的块操作
operater | dynamic_size block | fixed_size block |
---|---|---|
前n个 | vector.head(n) | vector.head |
后n个 | vector.tail(n) | vector.tail |
从i开始的n个元素 | vector.segment(i,n) | vector.segment |
矩阵运算
1 | MatrixXcf a = MatrixXcf::Random(3,3); |
矩阵的大小
矩阵赋值和大小变换
固定矩阵和动态矩阵
相关参考
Eigen: Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > Class Template Reference