1.2 矩阵和向量算术
本节主要是介绍矩阵、向量和标量之间的操作和算术细节
1.2.1 简介
矩阵/向量的算术操作在Eigen中要么通过算术符号(+,-,*,/)重载,要么通过方法(.dot())实现。对于矩阵类,算术符号重载只能执行线性代数运算,例如矩阵✖️矩阵,但不能进行向量+标量(常数)的运算。
1.2.2 加法和减法
运算符号左右侧必须是相同形状的矩阵,也必须有相同的标量类型(相同元素类型),支持运算包括:
- 双边运算:a+b
- 单边运算:-a
- 符合运算:-+ / +=
矩阵和向量除了可以使用逗号初始化方法,向量还可以使用C++中的括号进行初始化:
Eigen::Vector3d v(1,2,3);
Eigen::Vector3d w(1,0,0);
1.2.3 标量的乘除法
Eigen允许标量与矩阵之间进行乘除法,包括:
- 乘法:matrix * scaler or scaler * matrix
- 除法:matrix / scaler
- 复合运算:matrix *= scalar
1.2.4 转秩矩阵和共轭矩阵
矩阵转秩、共轭、伴随分别调用方法transpose(), conjugate(), and adjoint()。对于实数矩阵,共轭等于本身,因此伴随矩阵等价于矩阵转秩。
对于transpose() 和 adjoint() 方法,Eigen会返回一个代理对象而不做对应处理,例如b = a.transpose()时,程序会在写入b的同时做转秩,因此就地转秩 a = a.transpose() 是不合法的操作。这被称为“别名问题”。如果要就地使用转秩,需要调用transposeInPlace()方法。
1.2.5 矩阵乘法
矩阵矩阵、矩阵向量、向量*向量均使用操作符 * 号完成
1.2.6 点乘和叉乘
点乘:点乘结果为标量,dot()方法,该方法可以用于任何维度向量
叉乘:叉乘结果为向量,cross()方法,该方法只能用于3维向量以内
1.2.7 基础算数约归运算
主要是对向量的一些约归运算:
- sum():元素和
- prod():元素积
- mean():均值
- minCoeff():最小元素
- maxCoeff():最大元素
- trace():迹
此外,minCoeff和maxCoeff还可以通过引用传值,返回对应元素在矩阵中的坐标:
Matrix3f m = Matrix3f::Random();
std::ptrdiff_t i, j;
float minOfM = m.minCoeff(&i,&j);
cout << "Here is the matrix m:\n" << m << endl;
cout << "Its minimum coefficient (" << minOfM
<< ") is at position (" << i << "," << j << ")\n\n";
RowVector4i v = RowVector4i::Random();
int maxOfV = v.maxCoeff(&i);
cout << "Here is the vector v: " << v << endl;
cout << "Its maximum coefficient (" << maxOfV
<< ") is at position " << i << endl;