http://blog.sina.com.cn/s/blog_8171e92d0102vphr.html
一、初始化一个矩阵
定义一个固定大小矩阵:
Matrix M;
例如:
Matrix M(4, 5) ;//定义了一个四行五列的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;
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列开始r × c大小
M.size();//返回M元素个数,即row*col
M.resize(int ,int );//重置矩阵大小
注意:这里是dynamic-size matrix动态大小矩阵;
M.transpose();//矩阵的转置
M.conjugate();//共轭转置
M.adjoint();//伴随矩阵
注意:不能使用形如M=M.transpose();的赋值语句,会产生赋值错误(aliasing issue);
要写成:
M=M.transposInPlace();
类似的还有如下:
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()
{
Eigen::Matrix2d mat;
mat << 1, 2,
3, 4;
cout << "Here is mat.sum(): " << mat.sum() << endl;
cout << "Here is mat.prod(): " << mat.prod() << endl;
cout << "Here is mat.mean(): " << mat.mean() << endl;
cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl;
cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl;
cout << "Here is mat.trace(): " << mat.trace() << endl;
}
Array类:Array的赋值、加法、减法也与Matrix类似,需要说明的是Array相乘,这个操作类似于Matlab中的".*",对应元素做计算,所以两个Array相乘,只能是大小相同的Array。
Array提供了一些操作函数,abs(),求每个元素的绝对值;sqrt(),求每个元素的算术平方根;a.min(b),求a和b中每个位置较小的元素a.cos(),a.sin()。
Matrix和Array可以进行互换,利用matrix中的Array()函数和Array中的Matrix()函数,例如:M.array()*N.array()等价于M与N中对应元素相乘。M.array()+4等价于M中每个元素+4,也就是:
初始化特殊矩阵函数:
1、Zero()函数
ArrayXf::Zero(3);
ArrayXXf::Zero(3, 4);
2、Constant()函数
Constant(rows, cols, value);
3、Random()函数
4、Identity()函数,初始化一个单位矩阵,只适用于Matrix不是用于Array
5、LinSpaced(size, low, high);//类似Matlab中1:9生成一个大小位size的数列
6、setZero()、setIdentity()、......
四、关于动态矩阵和静态矩阵
简单来说:能用静态矩阵就用静态矩阵,尤其是矩阵较小的时候;当你不得不采用动态矩阵的时候,用动态矩阵。对于16个元素以下的矩阵,采用静态矩阵表现更加出色。
Matrix4f mymatrix;
等价于:
float mymatrix[16];
而
MatrixXf mymatrix(rows,columns);
意味着:
float *mymatrix = newfloat[rows*columns];