1. 程式人生 > >Eigen常用函式以及注意事項總結

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];