Eigen常用函式以及注意事項總結
阿新 • • 發佈:2019-01-06
一、初始化一個矩陣
定義一個固定大小矩陣:
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];
定義一個固定大小矩陣:
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];