最近由於課題原因,新接觸到乙個c++的線性代數模板庫,名為eigen(讀作
['aɪgən])。主頁位於
簡單理解eigen就是對矩陣和向量進行了抽象和建模,並且設計了相關的線性代運算的實現。簡單嘗試了之後發現上手很快,但是某些功能由於設計理念的獨特性,導致最終的實現方案比較特殊。
系統是ubuntu 16.04。
非常特殊的是,作為c++庫,eigen不需要編譯,而是以標頭檔案的形式提供給使用者的,之前用過的庫貌似tinyxml也是這樣。所以,所謂的安裝在linux上就是向/usr/local/include做了乙個資料夾的符號鏈結。既建立符號鏈結在/usr/local/include/eigen指向eigen的解壓後的位置。
直接抄官方文件中getting start的示例程式,測試了一下矩陣的建立,非常直接非常簡單。
#include #include using eigen::matrixxd;
int main(void)
其中matrixxd代表是執行時指定大小的矩陣(大寫的x),使用雙精度浮點數儲存矩陣元素(最後的小寫d)。可以看到,圓括號有過載。流輸出也有過載。
由於建立了系統級別的符號鏈結,所以編譯時不需要任何特殊設定,g++即可查詢到對應的標頭檔案並且完成編譯。程式執行的效果如下。
no big deal!
同樣直接抄官方的示例**
#include #include using namespace eigen;
using namespace std;
int main(void)
執行結果如下。
於是矩陣加法,數乘,矩陣與向量的乘法都有運算子過載,很不錯,有種matlab的感覺。
出了matrixxd類和vectorxd類以外,eigen還定義了常用維度的矩陣。根據eigen文件的說法,在編譯時能夠確定矩陣或向量維度時,可以給eigen優化的空間,並提供更高的執行效率。
eigen預設採用列主導(column major)的資料儲存形式,這點和fortran還有matlab是一樣的,當然也可以選擇採用行主導,但是我感覺真心沒必要。我一開始比較關心的是eigen是否定義了比較方便的額slicing操作。但是似乎eigen的slicing和我理解的不太一樣,有點複雜。eigen的文件中,slicing和reshape是一起講的,原因在於他們都是利用eigen定義的map功能實現的。簡單理解map就是將原始「連續記憶體儲存」的資料,以矩陣形式重新組織。在使用map時就需要原始資料,map後的資料的維度形式,map時使用的stride設定。所謂stride,既指矩陣中沿著矩陣列或行方向移動乙個位置,記憶體中需要移動的位置數。這個需要移動的記憶體位置數與矩陣採用的儲存方式有關(列或行主導)。eigen定義了常用的stride,既innerstride和outerstride。最好理解以上兩個stride的方法就是看例項。innerstride既表示沿著矩陣的資料儲存方向移動乙個元素的位置,在記憶體中需要移動的
寬度。outerstride的含義就是不沿著資料儲存方向移動乙個位置,在記憶體中需要移動的寬度。還是用例項進行說明。
#include #include using namespace eigen;
using namespace std;
int main(void)
以上例項**中,是在乙個3x8的矩陣中,取出包括第1列在內的3列,每隔2列取1列。建立m2時的最後乙個引數即為stride型別的變數。在這個例子中,map的stride被定義為每隔一列將空過9個元素的儲存位置。**的執行效果如下圖。
reshape的操作與slicing很像。
目測slicing都必須從原始資料的最開始進行,想要原始矩陣中的某一列後者某一行,或者某一塊,就需要block操作。實際最經常用的就是取出一行或者一列的操作。設計了如下的例項**。
#include #include using namespace eigen;
using namespace std;
int main(void)
在上面**中,測試了col()函式等eigen設計好用於獲取某列某行,或者從開頭或者結尾開始計算的連續多行或者多列的函式。執行結果如下圖。
4 神奇的注意點
關於class內部宣告eigen物件的特殊問題。
Eigen學習總結
最早接觸eigen,是在高翔博士編著的 視覺slam十四講 中,今天在這裡整理一下。eigen是乙個c 開源線性代數庫。它提供了快速的有關矩陣的線性代數運算,還包括解方程等功能。許多上層的軟體庫也使用eigen 進行矩陣運算,包括g2o sophus 等。sudo apt get install l...
Eigen學習筆記 2 Matrix類
原文 eigen官網 the matrix class 在eigen中,所有的矩陣matrix和向量vector都是由matrix類構造的。向量只不過是矩陣的特殊形式,只有一列 列向量 或者一行 行向量 matrix有6個模板引數,主要使用前三個引數,剩下的三個引數有預設值。matrixeigen ...
開源矩陣計算工具Eigen學習筆記(一)
看到 矩陣計算 這幾個字,大家肯定首先想到的是大名鼎鼎的美國mathworks公司開發的matlab矩陣實驗室,matlab功能的確非常強大。但有時由於一些特殊需求,我們只能用c c來程式設計實現矩陣運算。下面通過一些簡單的例子來了解eigen include include using eigen...