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;

​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();​//伴随矩阵

注意:不能使用形如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];
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值