Eigen學習筆記 3 矩陣和向量的運算

2021-10-01 09:32:59 字數 3376 閱讀 8107

原文:eigen官網-matrix and vector arithmetic

本節內容主要介紹eigen中關於矩陣、向量、標量之間的數**算。

eigen提供了matrix/vector的運算操作,既包括過載了c++的算術運算子+/-/*,也引入了一些特殊的運算比如點乘dot()、叉乘cross()等。

左右兩側的變數都必須具有相同的大小(行和列)和資料型別(eigen不會自動進行型別轉化)。操作符如下:

#include

#include

using

namespace eigen;

intmain()

結果如下:

a + b =

3 54 8

a - b =

-1 -1

2 0

doing a += b;

now a =

3 54 8

-v + w - v =

-1-4

-6

矩陣或者向量與標量進行乘法或除法操作是比較簡單的。操作符如下: a

ta^t

at表示轉置(transpose);

a

ˉ\bar

aˉ表示共軛(conjugate);

a

∗a^*

a∗表示共軛轉置(伴隨矩陣)(adjoint)。

上述三個操作分別通過transpose(), conjugate(),以及adjoint()函式實現。

示例如下:

#include

#include

using

namespace eigen;

intmain()

結果如下:

here is the matrix a

1 23 4

here is the transpose of a

1 32 4

here is the conjugate of a

1 23 4

here is the adjoint of a

1 32 4

對於實數矩陣,conjugate不執行任何操作,adjoint等價於transpose。

transpose和adjoint會簡單的返回乙個**物件並不做真正的轉置。如果執行 b=a.transpose() ,a不變,轉置結果被賦值給b。如果執行 a=a.transpose() eigen在轉置結束之前結果會開始寫入a,所以a的最終結果不一定等於a的轉置。這就是所謂的別名問題。在「除錯模式」中,也就是說,當斷言沒有被禁用時,這種常見的陷阱會被自動檢測到。

對於a = a.transpose()這種操作,可以使用transposeinplace()解決,類似的還有adjointinplace()

示例如下:

#include

#include

using

namespace eigen;

intmain()

結果如下:

here is the matrix a

1 23 4

b after being transposed:

1 32 4

因為向量是一種特殊的矩陣,因此本質上都是矩陣-矩陣的乘法。運算子如下:

m=m*m並不會導致別名問題,eigen在這裡做了特殊處理,引入了臨時變數。實質將編譯為:

tmp = m*m

m = tmp

如果你確定矩陣乘法是安全的(並沒有別名問題),你可以使用noalias()函式來避免臨時變數。

c.noalias() += a*b
dot()執行點積,cross()執行叉積,點運算得到1*1的矩陣。當然,點運算也可以用u.adjoint()*v來代替。

#include

#include

using

namespace eigen;

using

namespace std;

intmain()

結果如下:

dot product: 8

dot product via a matrix product: 8

cross product:

1-21

注意:點積只對三維vector有效。對於複數,eigen的點積是第乙個變數共軛和第二個變數的線性積。

eigen提供了一些歸約函式把乙個給定的矩陣或向量化為乙個值,比如

#include

#include

using

namespace std;

intmain()

結果如下:

here is mat.sum():       10

here is mat.prod(): 24

here is mat.mean(): 2.5

here is mat.mincoeff(): 1

here is mat.maxcoeff(): 4

here is mat.trace(): 5

its minimum coefficient (1) is at position (0,0)

here is the vector v: 730547559 -226810938 607950953 640895091

its maximum coefficient (730547559) is at position 0

eigen會檢測執行操作的有效性,在編譯階段eigen會檢測它們,錯誤資訊是繁冗的,但錯誤資訊會大寫字母突出,比如:

matrix3f m;

vector4f v;

v = m*v; // compile-time error: you_mixed_matrices_of_different_sizes

當然動態尺寸的錯誤要在執行時發現,如果在debug模式,assertions會觸發後,程式將崩潰。

matrixxf m(3,3);

vectorxf v(4);

v = m * v; // run-time assertion failure here: "invalid matrix product"

「eigen教程(3)」

Eigen 旋轉向量與旋轉矩陣(用法)

1 旋轉矩陣 旋轉向量 eigen angleaxisd rotation vector2 rotation vector2.fromrotationmatrix rotation matrix2 或者 eigen angleaxisd rotation vector2 rotation matri...

Eigen學習筆記

最近由於課題原因,新接觸到乙個c 的線性代數模板庫,名為eigen 讀作 a g n 主頁位於 簡單理解eigen就是對矩陣和向量進行了抽象和建模,並且設計了相關的線性代運算的實現。簡單嘗試了之後發現上手很快,但是某些功能由於設計理念的獨特性,導致最終的實現方案比較特殊。系統是ubuntu 16.0...

開源矩陣計算工具Eigen學習筆記(一)

看到 矩陣計算 這幾個字,大家肯定首先想到的是大名鼎鼎的美國mathworks公司開發的matlab矩陣實驗室,matlab功能的確非常強大。但有時由於一些特殊需求,我們只能用c c來程式設計實現矩陣運算。下面通過一些簡單的例子來了解eigen include include using eigen...