Eigen常用函數以及注意事項總結
06-14
一、初始化一個矩陣定義一個固定大小矩陣: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*colM.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 =
" << a + b << std::endl;?矩陣數乘或數除用*,/:?Matrix2d a;a << 1, 2,3, 4;Vector3d v(1,2,3);std::cout << "a * 2.5 =
" << a * 2.5 << std::endl;std::cout << "0.1 * v =
" << 0.1 * v << std::endl;v *= 2;std::cout << "Now v =
" << 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:
" << v.cross(w) << endl;?一些常用的演算法:?M.sum();//矩陣元素求和M.prod();//矩陣元素求積M.mean();//矩陣元素平均數M.maxCoeff();//最大元素M.minCoeff();//最小元素注意:M.maxCoeff(&i,&j)可以將最大元素的位置賦值給i,j?M.trace();?//矩陣的跡#include#includeusing 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不是用於Array5、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];
推薦閱讀:
" << a + b << std::endl;?矩陣數乘或數除用*,/:?Matrix2d a;a << 1, 2,3, 4;Vector3d v(1,2,3);std::cout << "a * 2.5 =
" << a * 2.5 << std::endl;std::cout << "0.1 * v =
" << 0.1 * v << std::endl;v *= 2;std::cout << "Now v =
" << 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:
" << v.cross(w) << endl;?一些常用的演算法:?M.sum();//矩陣元素求和M.prod();//矩陣元素求積M.mean();//矩陣元素平均數M.maxCoeff();//最大元素M.minCoeff();//最小元素注意:M.maxCoeff(&i,&j)可以將最大元素的位置賦值給i,j?M.trace();?//矩陣的跡#include#includeusing 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不是用於Array5、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];
推薦閱讀:
※55歲設計師畢生總結,34條裝修經驗拿去用吧,入住30年都不過時!
※正官格知識總結
※【實用總結】導致心源性暈厥的 8 大類病因
※金石全訣總結