天天看點

文章标題Eigen的矩陣運算使用

  在ROS的Cmake中使用Eigen庫進行矩陣和向量的運算和很友善。下面逐漸添加他的使用方法。

  

1 配置

  首先要在CmakeLists.txt中先進行設定:

由于Eigen是ros以外的庫,是以要單獨的使用

  find_package(Eigen REQUIRED)

同時Eigen依賴cmake_modules。是以還要

  find_package(catkin REQUIRED COMPONENTS

  cmake_modules)。

2 認識一些頭檔案

Eigen庫分為 核心子產品和額外子產品兩部分,每個子產品都有一個用這個子產品所相對應的頭檔案,Eigen和Dense頭檔案友善的同時包含了幾個頭檔案以供使用。下面做簡單介紹:

——Core

有關矩陣和數組的類,有基本的線性代數(包含 三角形 和 自伴乘積 相關),還有相應對數組的操作。

——Geometry

幾何學的類,有關轉換、平移、進位制、2D旋轉、3D旋轉(四元組和角軸相關)

——LU

邏輯單元的類,有關求逆,求行列式,LU分解解算器(FullPivLU,PartialPivLU)

——Cholesky

包含LLT和LDLT的喬裡斯基因式分解法。

(小科普:Cholesky分解是把一個對稱正定的矩陣表示成一個下三角矩陣L和其轉置的乘積的分解)

——Householder

豪斯霍爾德變換,這個子產品供幾個線性代數子產品使用。

(Householder transform: 維基百科 )

——SVD

奇異值分解,最小二乘解算器解決奇異值分解。

——QR

QR分解求解,三種方法:HouseholderQR、ColPivHouseholderQR、FullPivHouseholderQR

——Eigenvalues

特征值和特征向量分解的方法:EigenSolver、SelfAdjointEigenSolver、ComplexEigenSolver

——Sparse

稀疏矩陣相關類,對于稀疏矩陣的存儲及相關基本線性代數

——Dense

包含: Core、Gelometry、LU、Cholesky、SVD、QR和Eigenvalues子產品(頭檔案)

——Eigen

包含上述所有的子產品(頭檔案)

3 矩陣簡單操作

Eigen提供了兩種密集的對象Matrix(矩陣)和Vector(向量)。

這兩者是通過矩陣模闆類和一維或二維的數組模闆類來實作的。

這兩者有幾點不同:

——Matrix類型變量加減法,若行列數不相等,則不能做加減;

Array類型的可以加減一個常數(各個元素分别加減該常數)。

——Matrix與Array類型變量做乘法也會有不同,Matrix是矩陣相乘,Array是對應元素相乘。

——但兩者可以互相轉換,方法為 .array() 和 .matrix()。

3.1 定義

定義矩陣時,預設沒有初始化,必須自己初始化。

Eigen的矩陣類型,一般是Matrix後面跟類型符号來表示,比如說:

——’ d ’ 代表 double,矩陣存儲的是double型的資料

——’ f ’ 代表float,矩陣存儲的是float類型資料

——’ c ‘代表complex,矩陣存數的是複數類型資料

——’ i ‘代表int,矩陣存儲的是整數類型

相應關系為:

文章标題Eigen的矩陣運算使用

3.2 初始化

m1=MatrixXf::Zero(,);     // 将矩陣3行4列初始化為0
m2=MatrixXf::Ones(,);     // 将矩陣3行3列初始化為1
v1=Vector3f::Ones();        // 将3行的縱向量初始化為1

cout<<"m1=\n"<<m1<<endl;
cout<<"m2=\n"<<m2<<endl;
cout<<"v1=\n"<<v1<<endl;
           

運作結果為:

文章标題Eigen的矩陣運算使用

3.3 通路

直接就同數組的通路方式一樣,但是不是方括号,而是圓括号:

MatrixXf m3(,);
m3<<,,,,,;
cout<<"m3_1\n"<<m3<<endl;
// 為了美觀點,更像個矩陣,可以換行寫
m3<<,,-,
    ,,;
cout<<"m3_2=\n"<<m3<<endl;
// 将第2行第3列的值改為99
m3(,)=;
cout<<"m3_3=\n"<<m3<<endl;
           

當然,同數組一樣,第一行第一列的下标為(0,0)

輸出結果:

文章标題Eigen的矩陣運算使用

4 矩陣的運算

——置0

——置1

——随機矩陣

——機關陣

——求逆

——轉置

——數乘矩陣

——向量求模值

<span style="white-space:pre"> </span>MatrixXf m1(3,3); // 矩陣全部元素置0 m1.setZero(); cout<<"m1_1=\n"<<m1<<endl; // 矩陣全部元素置1 ( 這裡行列值不填,預設定義時候的行列, // 若填寫,則矩陣也會更改為填寫的行列值 ) m1.setOnes(2,2); cout<<"m1_2=\n"<<m1<<endl; // 随機生成一個矩陣 m1.setRandom(); cout<<"m1_3=\n"<<m1<<endl; // 置機關矩陣 m1.setIdentity(3,3); cout<<"m1_4=\n"<<m1<<endl; m1<< 1 , 2 , 3 , 5 , 9 ,10 , 7 , 0 ,1 ; // 矩陣求逆 m1.inverse(); cout<<"m1_5=\n"<<m1<<endl; // 矩陣轉置 m1.transpose(); cout<<"m1_6=\n"<<m1<<endl; // 數 * 矩陣 ( 數 / 矩陣 ) m1 = 2.6 * m1 ; cout<<"m1_7=\n"<<m1<<endl;

//求向量模值 norm()

待更新。。。。。

參考:

http://blog.csdn.net/lttree/article/details/39099315

繼續閱讀