Eigen學習筆記 2 Matrix類

2021-10-01 08:30:43 字數 3792 閱讀 5913

原文: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...