原文:eigen官網-the matrix class
在eigen中,所有的矩陣matrix和向量vector都是由matrix類構造的。向量只不過是矩陣的特殊形式,只有一列(列向量)或者一行(行向量)。
matrix有6個模板引數,主要使用前三個引數,剩下的三個引數有預設值。
matrix
eigen 提供了一些常用的 定義好的型別。比如,matrix4f表示乙個型別為float的4*4矩陣,在eigen中定義如下:
typedef matrixmatrix4f;
列向量是預設向量。
eigen中定義的包含3個float元素的列向量如下:
typedef matrixvector3f;
行向量定義如下:
typedef matrixrowvector2i;
eigen並沒有限制矩陣的尺寸必須在編譯的時候就要確定下來。如果矩陣的尺寸在編譯的時候是不確定的,而在執行的時候才能確定,eigen提供了定義動態大小的方法,稱為dynamic size;將在編譯時候就能確定的尺寸稱為fixed size.
matrixxd表示乙個具有動態大小的矩陣,定義如下:
typedef matrixmatrixxd;
vectorxi表示乙個具有動態大小的向量,定義如下:
typedef matrixvectorxi;
還可以定義行數固定而列數是動態大小的矩陣:
matrix
(1)預設的建構函式不執行任何空間分配,也不初始化矩陣的元素。
matrix3f a;
matrixxf b;
(2)帶引數的建構函式。
對於矩陣,行數在列數前面,對於向量,只有向量的大小。當對矩陣或向量指定大小時,只是分配相應大小的空間,未初始化元素。
matrixxf a(10,15);
vectorxf b(30);
(3)為了對固定大小和動態大小的矩陣提供統一的api,對指定大小的matrix傳遞sizes也是合法的(傳遞也被忽略)。
matrix3f a(3,3);
(4)可以用建構函式提供4以內尺寸的vector的初始化。
vector2d a(5.0, 6.0);
vector3d b(5.0, 6.0, 7.0);
vector4d c(5.0, 6.0, 7.0, 8.0);
eigen中通過對括號進行過載實現元素的獲取。對於矩陣是:(行,列);對於向量,只是傳遞它的索引。索引都是以0為起始的。
m(index)也可以用於獲取矩陣元素,但取決於matrix的儲存順序,預設是按列儲存的(即一列一列的進行儲存),當然也可以改為按行。
操作符可以用於向量元素的獲取,但是不能用於matrix,因為c++中不能傳遞超過乙個引數。
#include #include using namespace eigen;
int main()
結果:
here is the matrix m:
3 -1
2.5 1.5
m(2):
-1
可以使用逗號初始化方式(comma-initializer)給矩陣和向量賦值。例如:
matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
結果如下:
1 2 3
4 5 6
7 8 9
這樣就將上述值賦給了矩陣,在eigen中矩陣預設的儲存方式是行優先,就是先儲存行。
rows() , cols() , size() 方法分別返回行數,列數和 元素的個數。
eigen支援對動態大小的矩陣和向量重新指定大小,通過resize() 實現。
#include #include using namespace eigen;
int main()
結果如下:
the matrix m is of size 4x3
it has 12 coefficients
the vector v is of size 5
as a matrix, v is of size 5x1
如果matrix的實際大小不改變,resize函式不做任何操作;否則resize操作是具有破壞性的,矩陣中元素的值會被改變,如果不想改變元素的值可以執行 conservativeresize()。
為了統一api,所有的操作可用於固定大小的matrix,當然,實際中它不會改變大小。嘗試去改變乙個固定大小的matrix到乙個不同的值,會出發警告失敗。只有如下是合法的。
#include #include using namespace eigen;
int main()
assignment(分配)是複製乙個矩陣到另外乙個,通過操作符「=」實現。eigen會自動resize左變數的大小以等於右側變數的大小。
當然,如果左邊變數是固定大小的,resizing是不允許的。
matrixxf a(2,2);
std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl;
matrixxf b(3,3);
a = b;
std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl;
結果如下:
a is of size 2x2
a is now of size 3x3
實際中,應該使用固定尺寸還是動態尺寸,簡單的答案是:對於小尺寸的矩陣,使用固定大小的方式,對於大尺寸的矩陣,使用動態大小的方式。
matrix4f mymatrix;
等價於float mymatrix[16]
;
matrixxf mymatrix(rows,columns);
等價於float *mymatrix = new float[rows*columns];
使用固定尺寸可以避免動態記憶體的開闢,固定尺寸只是乙個普通陣列。
使用固定尺寸(<=4*4)需要編譯前知道矩陣大小,而且對於足夠大的尺寸,如大於32,固定尺寸的收益可以忽略不計,相反,很可能會導致棧崩潰,因為eigen嘗試將陣列自動分配為區域性變數,這通常在堆疊上完成。而且基於環境,eigen會對動態尺寸做優化(類似於std::vector)。
如下石matrix類的完整引數列表:
matrix
eigen定義了一些matrix的型別:
其中,n可以是2,3,4或x(dynamic);
t可以是i(int)、f(float)、d(double)、cf(complex)、cd(complex)等。
「eigen教程(2)」
「eigen學習筆記2-matrix類」
Eigen學習筆記
最近由於課題原因,新接觸到乙個c 的線性代數模板庫,名為eigen 讀作 a g n 主頁位於 簡單理解eigen就是對矩陣和向量進行了抽象和建模,並且設計了相關的線性代運算的實現。簡單嘗試了之後發現上手很快,但是某些功能由於設計理念的獨特性,導致最終的實現方案比較特殊。系統是ubuntu 16.0...
Android學習筆記高階十之Matrix錯切變換
剛開始我也不懂啥叫錯切變換,一看效果圖你就恍然大悟。對影象的錯切變換做個總結 x x0 b y0 y d x0 y0 與之對應的方法是 matrix matrix new matrix matrix.setskew 0.0f,0.5f 再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默...
開源矩陣計算工具Eigen學習筆記(一)
看到 矩陣計算 這幾個字,大家肯定首先想到的是大名鼎鼎的美國mathworks公司開發的matlab矩陣實驗室,matlab功能的確非常強大。但有時由於一些特殊需求,我們只能用c c來程式設計實現矩陣運算。下面通過一些簡單的例子來了解eigen include include using eigen...