Eigen是可以用來進(jìn)行線性代數(shù)胡桨、矩陣、向量操作等運(yùn)算的C++庫烫堤,它里面包含了很多算法荣赶。它的License是MPL2凤价。它支持多平臺。
Eigen采用源碼的方式提供給用戶使用拔创,在使用時只需要包含Eigen的頭文件即可進(jìn)行使用利诺。之所以采用這種方式,是因?yàn)镋igen采用模板方式實(shí)現(xiàn)剩燥,由于模板函數(shù)不支持分離編譯慢逾,所以只能提供源碼而不是動態(tài)庫的方式供用戶使用。
矩陣的定義:Eigen中關(guān)于矩陣類的模板函數(shù)中灭红,共有六個模板參數(shù)侣滩,常用的只有前三個。其前三個參數(shù)分別表示矩陣元素的類型变擒、行數(shù)和列數(shù)君珠。
矩陣定義時可以使用Dynamic來表示矩陣的行列數(shù)為未知。
Eigen中無論是矩陣還是數(shù)組娇斑、向量策添,無論是靜態(tài)矩陣還是動態(tài)矩陣都提供默認(rèn)構(gòu)造函數(shù),也就是定義這些數(shù)據(jù)結(jié)構(gòu)時都可以不用提供任何參數(shù)毫缆,其大小均由運(yùn)行時來確定唯竹。矩陣的構(gòu)造函數(shù)中只提供行列數(shù)、元素類型的構(gòu)造參數(shù)苦丁,而不提供元素值的構(gòu)造浸颓,對于比較小的、固定長度的向量提供初始化元素的定義芬骄。
矩陣類型:Eigen中的矩陣類型一般都是用類似MatrixXXX來表示猾愿,可以根據(jù)該名字來判斷其數(shù)據(jù)類型,比如”d”表示double類型账阻,”f”表示float類型蒂秘,”i”表示整數(shù),”c”表示復(fù)數(shù)淘太;Matrix2f姻僧,表示的是一個2*2維的,其每個元素都是float類型蒲牧。
數(shù)據(jù)存儲:Matrix創(chuàng)建的矩陣默認(rèn)是按列存儲撇贺,Eigen在處理按列存儲的矩陣時會更加高效。如果想修改可以在創(chuàng)建矩陣的時候加入?yún)?shù)冰抢,如:
Matrix<int,3, 4, ColMajor> Acolmajor;
Matrix<int,3, 4, RowMajor> Arowmajor;
動態(tài)矩陣和靜態(tài)矩陣:動態(tài)矩陣是指其大小在運(yùn)行時確定松嘶,靜態(tài)矩陣是指其大小在編譯時確定。
MatrixXd:表示任意大小的元素類型為double的矩陣變量挎扰,其大小只有在運(yùn)行時被賦值之后才能知道翠订。
Matrix3d:表示元素類型為double大小為3*3的矩陣變量巢音,其大小在編譯時就知道。
在Eigen中行優(yōu)先的矩陣會在其名字中包含有row尽超,否則就是列優(yōu)先官撼。
Eigen中的向量只是一個特殊的矩陣,其維度為1而已似谁。
矩陣元素的訪問:在矩陣的訪問中傲绣,行索引總是作為第一個參數(shù),Eigen中矩陣巩踏、數(shù)組秃诵、向量的下標(biāo)都是從0開始。矩陣元素的訪問可以通過”()”操作符完成蛀缝。例如m(2, 3)既是獲取矩陣m的第2行第3列元素顷链。
針對向量還提供”[]”操作符,注意矩陣則不可如此使用屈梁。
設(shè)置矩陣的元素:在Eigen中重載了”<<”操作符嗤练,通過該操作符即可以一個一個元素的進(jìn)行賦值,也可以一塊一塊的賦值在讶。另外也可以使用下標(biāo)進(jìn)行賦值煞抬。
重置矩陣大小:當(dāng)前矩陣的行數(shù)构哺、列數(shù)革答、大小可以通過rows()、cols()和size()來獲取曙强,對于動態(tài)矩陣可以通過resize()函數(shù)來動態(tài)修改矩陣的大小残拐。注意:(1)、固定大小的矩陣是不能使用resize()來修改矩陣的大械臁溪食;(2)、resize()函數(shù)會析構(gòu)掉原來的數(shù)據(jù)娜扇,因此調(diào)用resize()函數(shù)之后將不能保證元素的值不改變错沃;(3)、使用”=”操作符操作動態(tài)矩陣時雀瓢,如果左右兩邊的矩陣大小不等枢析,則左邊的動態(tài)矩陣的大小會被修改為右邊的大小。
如何選擇動態(tài)矩陣和靜態(tài)矩陣:對于小矩陣(一般大小小于16)使用固定大小的靜態(tài)矩陣刃麸,它可以帶來比較高的效率醒叁;對于大矩陣(一般大小大于32)建議使用動態(tài)矩陣。注意:如果特別大的矩陣使用了固定大小的靜態(tài)矩陣則可能會造成棧溢出的問題。
矩陣和向量的算術(shù)運(yùn)算:在Eigen中算術(shù)運(yùn)算重載了C++的+辐益、-断傲、*
(1)脱吱、矩陣的運(yùn)算:
提供+智政、-、一元操作符”-”箱蝠、+=续捂、-=;二元操作符+/-宦搬,表示兩矩陣相加(矩陣中對應(yīng)元素相加/減牙瓢,返回一個臨時矩陣);一元操作符-表示對矩陣取負(fù)(矩陣中對應(yīng)元素取負(fù)间校,返回一個臨時矩陣)矾克;組合操作法+=或者-=表示(對應(yīng)每個元素都做相應(yīng)操作);矩陣還提供與標(biāo)量(單一數(shù)字)的乘除操作憔足,表示每個元素都與該標(biāo)量進(jìn)行乘除操作胁附;
(2)、求矩陣的轉(zhuǎn)置滓彰、共軛矩陣控妻、伴隨矩陣:
可以通過成員函數(shù)transpose()、conjugate()揭绑、adjoint()來完成弓候。注意:這些函數(shù)返回操作后的結(jié)果,而不會對原矩陣的元素進(jìn)行直接操作他匪,如果要讓原矩陣進(jìn)行轉(zhuǎn)換菇存,則需要使用響應(yīng)的InPlace函數(shù),如transpoceInPlace()等邦蜜;
(3)依鸥、矩陣相乘、矩陣向量相乘:
使用操作符畦徘,共有和*=兩種操作符毕籽;
(4)、矩陣的塊操作:有兩種使用方法:
matrix.block(i,j, p, q) : 表示返回從矩陣(i, j)開始井辆,每行取p個元素关筒,每列取q個元素所組成的臨時新矩陣對象,原矩陣的元素不變杯缺;
matrix.block<p,q>(i, j) :<p, q>可理解為一個p行q列的子矩陣蒸播,該定義表示從原矩陣中第(i, j)開始,獲取一個p行q列的子矩陣,返回該子矩陣組成的臨時矩陣對象袍榆,原矩陣的元素不變胀屿;
(5)、向量的塊操作:
獲取向量的前n個元素:vector.head(n);
獲取向量尾部的n個元素:vector.tail(n);
獲取從向量的第i個元素開始的n個元素:vector.segment(i,n);
Map類:在已經(jīng)存在的矩陣或向量中包雀,不必拷貝對象宿崭,而是直接在該對象的內(nèi)存上進(jìn)行運(yùn)算操作。
原文鏈接:https://blog.csdn.net/fengbingchun/article/details/47378515