1.Matrix类:
定义:Matrix<类型, 行, 列>
eigen库中封装好了一些常用的矩阵,例如:
typedef Matrix<float, 4, 4> Matrix4f;
当然我们也可以自己设置,矩阵的行和列可以设置为固定的值也可以设置动态的(Dynamic),小的尺寸用固定的,大的尺寸用动态的,使用固定尺寸可以避免动态内存的开辟。
1)初始化方式
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
通过中括号获取元素,对于矩阵是:(行,列);对于向量,只是传递它的索引,以0为起始。
MatrixXd m1(2,2);
m1(0,0) = 3;
m1(1,0) = 2.5;
m1(0,1) = -1;
m1(1,1) = m1(1,0) + m1(0,1);
2)矩阵的属性
矩阵的行,列,大小
cout<<"行: "<<m.cols()<<" 列: "<<m.rows()<<" 大小: "<<m.size();
3)resize()
只用行和列是动态参数的时候才可以使用,否则会报错,而且输入的时候编译器会检查。
m.resize(2,3);
cout<<m<<endl;
cout<<"行: "<<m.cols()<<" 列: "<<m.rows()<<" 大小: "<<m.size()<<endl;
assignment(分配)是复制一个矩阵到另外一个,操作符=。Eigen会自动resize左变量大小等于右变量大小,比如:
MatrixXf a(2,2);
std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl;
MatrixXf b(3,3);
a = b;
std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl;
4)构造函数
默认的构造函数不执行任何空间分配,也不初始化矩阵的元素。
Matrix3f a;
MatrixXf b;
指定大小的矩阵,只是分配相应大小的空间,未初始化元素。
MatrixXf a(10,15);
VectorXf b(30);
为了对固定大小和动态大小的矩阵提供统一的API,对指定大小的Matrix传递sizes也是合法的(传递也被忽略)。
Matrix3f a(3,3);
可以用构造函数提供4以内尺寸的vector的初始化。
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)其他模板参数
Matrix<typename Scalar,
int RowsAtCompileTime,
int ColsAtCompileTime,
int Options = 0,
int MaxRowsAtCompileTime = RowsAtCompileTime,
int MaxColsAtCompileTime = ColsAtCompileTime>
Options是一个比特标志位,这里,我们只介绍一种RowMajor,它表明matrix使用按行存储,默认是按列存储。Matrix<float, 3, 3, RowMajor>
,MaxRowsAtCompileTime和MaxColsAtCompileTime表示在编译阶段矩阵的上限。主要是避免动态内存分配。
Matrix<float, Dynamic, Dynamic, 0, 3, 4>
6)矩阵的+、-、数×、乘法
左右两侧变量具有相同的尺寸(行和列),并且元素类型相同(Eigen不自动转化类型),其运算和int,float等基本类型相同。
#include <Eigen/Core>
#include<Eigen/Dense>
#include<iostream>
using namespace std;
using namespace Eigen;
int main()
{
Matrix2d m(2,2);
m(0,0)=-1;
m(0,1)=0;
m(1,0)=0;
m(1,1)=1;
Vector2d v1(1,2),v2(2,3);
cout<<m*v1<<endl;
cout<<m*v2<<endl;
cout<<v1.transpose()*v2<<endl;
return 0;
}
7)点×和叉×
Vector3d v(3,4,5);
Vector3d w(0,2,3);
cout<<v.dot(w)<<endl;
cout<<v.cross(w)<<endl;
return 0;
8)转置、共轭、伴随
表示transpose转置
表示conjugate共轭
表示adjoint(共轭转置) 伴随矩阵
MatrixXcf a = MatrixXcf::Random(2,2);
cout << "Here is the matrix a\n" << a << endl;
cout << "Here is the matrix a^T\n" << a.transpose() << endl;
cout << "Here is the conjugate of a\n" << a.conjugate() << endl;
cout << "Here is the matrix a^*\n" << a.adjoint() << endl;
transpose和adjoint会简单的返回一个代理对象并不对本省做转置。如果执行 b=a.transpose()
,a不变,转置结果被赋值给b。如果执行 a=a.transpose()
Eigen在转置结束之前结果会开始写入a,所以a的最终结果不一定等于a的转置。
a = a.transpose();,如果要就地转置a.transposeInPlace();
Matrix2i a; a << 1, 2, 3, 4;
cout << "Here is the matrix a:\n" << a << endl;
a = a.transpose(); // !!! do NOT do this !!!
cout << "and the result of the aliasing effect:\n" << a << endl;
Here is the matrix a:
1 2
3 4
and the result of the aliasing effect:
1 2
2 4
9)