1.Eigen: 是C++開(kāi)源矩陣計(jì)算工具.
2.Eigen用源碼的方式提供給用戶使用,在使用時(shí)只需要包含Eigen的頭文件即可進(jìn)行使用。之所以采用這種方式,是因?yàn)镋igen采用模板方式實(shí)現(xiàn),由于模板函數(shù)不支持分離編譯,所以只能提供源碼而不是動(dòng)態(tài)庫(kù)的方式供用戶使用,不過(guò)這也更方面用戶使用和研究。
3.Eigen中矩陣類的模板函數(shù)中,共有6個(gè)模板參數(shù),但是目前常用的只有前三個(gè),如下所示:
template<typename?_Scalar,
???????????????? int?_Rows,
???????????????? int?_Cols,
???????????????? int?_Options,
???????????????? int?_MaxRows,
???????????????? int?_MaxCols>??
struct?traits<Matrix<_Scalar,? _Rows,? _Cols,? _Options,? _MaxRows,? _MaxCols>?>??
其中,前三個(gè)參數(shù)分別表示矩陣元素的類型,行數(shù)和列數(shù)。
矩陣定義時(shí)可以使用Dynamic來(lái)表示矩陣的行列數(shù)為未知,例如:
typedef?Matrix<double,Dynamic, Dynamic>?MatrixXd;
在Eigen中也提供了很多常見(jiàn)的簡(jiǎn)化定義形式,例如:
typedef Matrix< double , 3 , 1> Vector3d? //3維列向量
4.Eigen中無(wú)論是矩陣還是數(shù)組、向量,無(wú)論是靜態(tài)矩陣還是動(dòng)態(tài)矩陣都提供默認(rèn)構(gòu)造函數(shù),也就是你定義這些數(shù)據(jù)結(jié)構(gòu)時(shí)都可以不用提供任何參數(shù),其大小均由運(yùn)行時(shí)來(lái)確定。
5.矩陣的構(gòu)造函數(shù)中只提供行列數(shù)、元素類型的構(gòu)造參數(shù),而不提供元素值的構(gòu)造,對(duì)于比較小的、固定長(zhǎng)度的向量提供初始化元素的定義,例如:
Vector2d?a(5.0,?6.0);??
Vector3d?b(5.0,?6.0,?7.0);??
Vector4d?c(5.0,?6.0,?7.0,?8.0);??
6.動(dòng)態(tài)矩陣是指其大小在運(yùn)行時(shí)確定,靜態(tài)矩陣是指其大小在編譯時(shí)確定,在Eigen中并未這樣稱呼矩陣。
//代碼1
#include?<iostream>??
#include?<Eigen/Dense>??
using?namespace?Eigen;??
using?namespace?std;??
int?main()??
{??
MatrixXd?m?=?MatrixXd::Random(3,3);??
m?=?(m?+?MatrixXd::Constant(3,3,1.2))?*?50;??
cout?<<"m?="?<<?endl?<<?m?<<?endl;??
VectorXd?v(3);??
v?<<?1,?2,?3;??
cout?<<"m?*?v?="?<<?endl?<<?m?*?v?<<?endl;??
}?
//代碼2
#include?<iostream>??
#include?<Eigen/Dense>??
using?namespace?Eigen;??
using?namespace?std;??
int?main()??
{??
Matrix3d?m?=?Matrix3d::Random();??
m?=?(m?+?Matrix3d::Constant(1.2))?*?50;??
cout?<<"m?="?<<?endl?<<?m?<<?endl;??
Vector3d?v(1,2,3);??
cout?<<"m?*?v?="?<<?endl?<<?m?*?v?<<?endl;??
}??
1)代碼段1中Matrix3d表示任意大小的元素類型為double的矩陣變量,其大小只有在運(yùn)行時(shí)被賦值之后才能知道;MatrixXd::Random(3,3)表示產(chǎn)生一個(gè)元素類型為double的3*3的臨時(shí)矩陣對(duì)象。
2) 代碼段2中Matrix3d表示元素類型為double大小為3*3的矩陣變量,其大小在編譯時(shí)就知道;
3)上例中向量的定義也是類似,不過(guò)這里的向量時(shí)列優(yōu)先,在Eigen中行優(yōu)先的矩陣會(huì)在其名字中包含有row,否則就是列優(yōu)先。
4)向量只是一個(gè)特殊的矩陣,其一個(gè)維度為1而已,如:typedef Matrix< double , 3 , 1> Vector3d
7.訪問(wèn)矩陣元素: 在矩陣的訪問(wèn)中,行索引總是作為第一個(gè)參數(shù),需注意Eigen中遵循大家的習(xí)慣讓矩陣、數(shù)組、向量的下標(biāo)都是從0開(kāi)始。矩陣元素的訪問(wèn)可以通過(guò)()操作符完成,例如m(2,3)即是獲取矩陣m的第2行第3列元素(注意行列數(shù)從0開(kāi)始)??蓞⒖慈缦麓a:
#include?<iostream>??
#include?<Eigen/Dense>??
using?namespace?Eigen;??
int?main()??
{??
MatrixXd?m(2,2);??
m(0,0)?=?3;??
m(1,0)?=?2.5;??
m(0,1)?=?-1;??
m(1,1)?=?m(1,0)?+?m(0,1);??
std::cout?<<"Here?is?the?matrix?m:\n"?<<?m?<<?std::endl;??
VectorXd?v(2);??
v(0)?=?4;??
v(1)?=?v(0)?-?1;??
std::cout?<<"Here?is?the?vector?v:\n"?<<?v?<<?std::endl;??
}??

8.矩陣元素賦值: 在Eigen中重載了"<<"操作符,通過(guò)該操作符即可以一個(gè)一個(gè)元素的進(jìn)行賦值,也可以一塊一塊的賦值。另外也可以使用下標(biāo)進(jìn)行復(fù)制,例如下面代碼:

9.設(shè)置矩陣的大小: 當(dāng)前矩陣的行數(shù)、列數(shù)、大小可以通過(guò)rows(),cols()和size()來(lái)獲取,對(duì)于動(dòng)態(tài)矩陣可以通過(guò)resize()函數(shù)來(lái)動(dòng)態(tài)修改矩陣的大小.
10.固定大小的矩陣是不能使用resize()來(lái)修改矩陣的大小;
11.resize()函數(shù)會(huì)析構(gòu)掉原來(lái)的數(shù)據(jù),因此調(diào)用resize()函數(shù)之后將不能保證元素的值不改變。
12.使用“=”操作符操作動(dòng)態(tài)矩陣時(shí),如果左右邊的矩陣大小不等,則左邊的動(dòng)態(tài)矩陣的大小會(huì)被修改為右邊的大小。例如下面的代碼段:

13.如何選擇動(dòng)態(tài)矩陣和靜態(tài)矩陣?
Eigen對(duì)于這問(wèn)題的答案是:
對(duì)于小矩陣(一般大小小于16)的使用固定大小的靜態(tài)矩陣,它可以帶來(lái)比較高的效率,
對(duì)于大矩陣(一般大小大于32)建議使用動(dòng)態(tài)矩陣。
還需特別注意的是:如果特別大的矩陣使用了固定大小的靜態(tài)矩陣則可能造成棧溢出的問(wèn)題.
參考:
1.https://blog.csdn.net/liufengl138/article/details/78405652