Eigen庫(kù)矩陣的基本類型

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 容器 在實(shí)際的開(kāi)發(fā)過(guò)程中, 數(shù)據(jù)結(jié)構(gòu)本身的重要性不會(huì)遜于操作于數(shù)據(jù)結(jié)構(gòu)的算法的重要性, 當(dāng)程序中存在著對(duì)時(shí)間要求很...
    編程小兔崽閱讀 1,181評(píng)論 0 1
  • Eigen3的安裝方式一般用兩種,一是簡(jiǎn)單的命令安裝,二是用源碼編譯安裝; 1.簡(jiǎn)單命令安裝 sudo apt-g...
    AI秘籍閱讀 39,709評(píng)論 0 2
  • C++基礎(chǔ) 模板及標(biāo)準(zhǔn)模板庫(kù) 模板的作用模板使程序員能夠快速的建立具有類型安全得庫(kù)集合和函數(shù)集合,它的實(shí)現(xiàn),方便了...
    I踏雪尋梅閱讀 572評(píng)論 0 4
  • 技術(shù)交流QQ群:1027579432,歡迎你的加入! 1.Cpp中的數(shù)組 C++支持?jǐn)?shù)組數(shù)據(jù)結(jié)構(gòu),它可以存儲(chǔ)一個(gè)固...
    CurryCoder閱讀 1,705評(píng)論 0 1
  • 今天用來(lái)曉島看書(shū)。就是高曉松開(kāi)的書(shū)店。沒(méi)有想象中大。需要提前一周預(yù)約,限200人,所以不會(huì)太擁擠。 到了朝陽(yáng)大悅城...
    Mia面閱讀 520評(píng)論 3 1

友情鏈接更多精彩內(nèi)容