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