矩阵和算数运算
Eigen 通过重载C++的算数运算符或特殊方法来进行矩阵的算数运算
加减
参与加减的矩阵要满足行列情况,并且元素数据类型也要相同,Eigen 不会自己进行数据类型转换。
//这里简单给出加减法运算,注意数据矩阵的数据类型
Matrix2d a;
a << 1, 2,
3, 4;
MatrixXd b(2,2);
b << 2, 3,
1, 4;
//双目加法:a+b
//双目减法:a-b
//单目减法:-a
//复合加法:a+=b //a = a + b;
//复合减法:a-=b //a = a - b;
标量与矩阵的乘除法
Matrix2d a;
a << 1, 2,
3, 4;
//双目乘法:a*2.5
//双目乘法:2.5*a
//双目除法:a/2.5
//复合乘法:a*=2.5
//复合除法:a/=2.5
关于表达式模板的说明
在Eigen 中,算术运算符本身是不执行任何计算,他只返回一个描述要执行的“表达式对象”,实际的计算是编译器进行优化后进行的。
说白了,不要去想象矩阵运算是怎么进行的,是按照数学上直接相加还是怎么样,不关心也没必要去知道。
转置、共轭和伴随
注意:
transpose()
并adjoint()
简单地返回一个代理对象没有做实际的换位。- 尽量避免
a = a.transpose()
这样的操作,这种操作a 将不会发生变化,这种现象称为aliasing issue。
Matrix2d a;
a << 1, 2,
3, 4;
Matrix2d b;
a << 5, 2,
7, 5;
a.transpose(); //转置,a取转置,但a本身不变化
a.conjugate(); //共轭
a.adjoint(); //伴随
a.transposeInPlace(); //对a 进行立即取转置,a 直接产生变化
b = a.transpose(); //结果在写入的时候同时产生转置,之前的a.transpose()只是简单的返回代理对象,并没有进行转换
a = a.transpose(); //不允许这样做,a的值将不变化。在写入a的同时还要对a进行转置,这不难为人么
矩阵乘法
注意:
- Eiegn将矩阵乘法当成特殊情况,不会出现aliasing issue,因为Eigen会添加一个临时变量temp = a*a
Matrix2d a;
a << 1, 2,
3, 4;
Matrix2d b;
b << 2, 3,
4, 5;
//双目乘法:a*b
//复合乘法:a*=b //等价于a = a*b,注意a,b位置
//允许:a = a*a //可以这样写,不会产aliasing issue
点积和叉积
注意:
- 点积使用任意大小向量;
- 叉积只适用于大小为3的向量;
Ve