Eigen常用函数以及注意事项总结
一、初始化一个矩阵
定义一个固定大小矩阵:
Matrix M;
例如:
Matrix M;//定义了一个四行五列的double型矩阵
定义一个动态矩阵
MatrixXd M(4,5);//定义了一个四行五列的double矩阵
Eigen定义了一些Macro例如
typedef Matrix Vector3f;
typedef Matrix RowVector2i;
typedef Matrix MatrixXd;
二、矩阵的赋值
1、重写了 << operator
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
identity matrix是什么意思​2、逐个元素赋值
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);
三、常用函数:
M.rows();//返回M行数
M.cols();//返回M列数
M.row(i);//返回第i行
M.col(j);//返回第j列
M.block<2,3>(1,2);//返回一个2x3的子块,从1行2列开始
M.block(i,j,r,c);//返回矩阵子块,i行j列开始rxc大小
M.size();//返回M元素个数,即row*col
M.resize(int ,int );//重置矩阵大小
注意:这里是dynamic-size matrix动态大小矩阵;
M.transpose();//矩阵的转置
M.conjugate();//共轭转置
M.adjoint();//伴随矩阵
注意:不能使用形如anspose();的赋值语句,会产生赋值错误(aliasing issue);
要写成:
ansposInPlace();
类似的还有如下:
MatrixBase::adjoint()
MatrixBase::adjointInPlace()
DenseBase::reverse()
DenseBase::reverseInPlace()
DenseBase::transpose()
DenseBase::transposeInPlace()
相同大小矩阵可以+、-运算:
Matrix2d a;
a << 1, 2,
3, 4;
MatrixXd b(2,2);
b << 2, 3,
1, 4;
std::cout << "a + b =\n" << a + b << std::endl;
矩阵数乘或数除用*,/:
Matrix2d a;
a << 1, 2,
3, 4;
Vector3d v(1,2,3);
std::cout << "a * 2.5 =\n" << a * 2.5 << std::endl;
std::cout << "0.1 * v =\n" << 0.1 * v << std::endl;
v *= 2;
std::cout << "Now v =\n" << v << std::endl;
矩阵直接相乘用*,相当于MxN;
v.dot(w);//向量点乘
v.cross(w);//向量叉乘
Vector3d v(1,2,3);
Vector3d w(0,1,2);
cout << "Dot product: " << v.dot(w) << endl;
cout << "Cross product:\n" << v.cross(w) << endl;
一些常用的算法:
M.sum();//矩阵元素求和
M.prod();//矩阵元素求积
M.mean();//矩阵元素平均数
M.maxCoeff();//最大元素
M.minCoeff();//最小元素
注意:M.maxCoeff(&i,&j)可以将最大元素的位置赋值给i,j
M.trace();//矩阵的迹
#include
#include
using namespace std;
int main()