0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于線性代數(shù)的C ++模板庫(kù)

3D視覺(jué)工坊 ? 來(lái)源:3D視覺(jué)工坊 ? 2023-06-25 10:28 ? 次閱讀

00 Eigen簡(jiǎn)介

Eigen:基于線性代數(shù)的C ++模板庫(kù),主要用于矩陣,向量,數(shù)值求解器和相關(guān)算法。SLAM中常用的Ceres、G2O等項(xiàng)目均是基于Eigen庫(kù)。

Eigen庫(kù)的優(yōu)點(diǎn):

支持整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù),使用模板編程,可以為特殊的數(shù)據(jù)結(jié)構(gòu)提供矩陣操作。

OpenCV自帶到Eigen的接口。

支持逐元素、分塊、和整體的矩陣操作。

支持使用Intel MKL加速部分功能。

支持多線程,對(duì)稀疏矩陣支持良好。

支持常用幾何運(yùn)算,包括旋轉(zhuǎn)矩陣、四元數(shù)、矩陣變換、角軸等等。

即使不做SLAM,在3D視覺(jué)中,當(dāng)處理大量數(shù)學(xué)運(yùn)算時(shí),我們也會(huì)用到Eigen庫(kù),它幫我們優(yōu)化了性能。在安裝完成Eigen庫(kù)后,開(kāi)始接下來(lái)的學(xué)習(xí)。

01 數(shù)據(jù)類(lèi)型

Eigen庫(kù)的核心類(lèi)是Matrix,由6個(gè)參數(shù)構(gòu)成:

Matrix<
????????typename?Scalar,
????????int?RowsAtCompileTime,
????????int?ColsAtCompileTime,
????????int?Options?=?0,???????????????????????????????//?默認(rèn)(無(wú)需更改)
????????int?MaxRowsAtCompileTime?=?RowsAtCompileTime,??//?默認(rèn)(最大行數(shù),提前知道極限)
????????int?MaxColsAtCompileTime?=?ColsAtCompileTime???//?默認(rèn)(最大列數(shù),提前知道極限)
>

其中:

前三個(gè)參數(shù):需要我們指定

后三個(gè)參數(shù):默認(rèn)即可,無(wú)需指定

因?yàn)榻?jīng)常需要實(shí)例化一些方陣、向量,因此Eigen庫(kù)也提供了很多直接使用的模板(利用C++的關(guān)鍵字:typedef),例如Matrix4f是的float型矩陣:

typedefMatrixMatrix4f;

還有例如列向量:Vector3f,其本質(zhì)也是Matrix類(lèi):

typedefMatrixVector3f;

行向量RowVector:

typedefMatrixRowVector2i;

靜態(tài)-動(dòng)態(tài)-矩陣

靜態(tài)矩陣:矩陣是靜態(tài)的,即編譯時(shí)候就知道運(yùn)行結(jié)果,例如Matrix3d:表示元素類(lèi)型為double大小為3*3的矩陣變量,其大小在編譯時(shí)就知道。

動(dòng)態(tài)矩陣:有時(shí)候運(yùn)行完之后,才可以知道,這里使用MatrixXd:表示任意大小的元素類(lèi)型為double的矩陣變量,其大小只有在運(yùn)行被賦值之后才能知道;

數(shù)據(jù)類(lèi)型

Eigen中的矩陣類(lèi)型一般都是用類(lèi)似MatrixNX來(lái)表示,可以根據(jù)該名字來(lái)判斷其大?。?,3,4,或X,意思Dynamic)和數(shù)據(jù)類(lèi)型,比如:

d:表示double類(lèi)型

f:表示float類(lèi)型

i:表示整數(shù)

c:表示復(fù)數(shù);

舉例:Matrix2f,表示的是一個(gè)維的,其每個(gè)元素都是float類(lèi)型。

02 新建矩陣

矩陣構(gòu)造

默認(rèn)構(gòu)造,分配了大小和內(nèi)存空間,但沒(méi)有初始化矩陣元素(里面的數(shù)值是隨機(jī)的,不能使用):

Matrix3fa;// 3*3的元素,其中還有一個(gè)float[9]數(shù)組,其中的元素沒(méi)有初始化;
MatrixXfb;//動(dòng)態(tài)大小的矩陣,目前的大小是0*0,它的元素?cái)?shù)組完全沒(méi)有分配。

對(duì)于動(dòng)態(tài)數(shù)組,你也可以直接分配大?。ㄊプ饔昧耍瑯記](méi)有初始化矩陣元素:

MatrixXfa(10,15);// 10x15動(dòng)態(tài)矩陣,數(shù)組內(nèi)存已經(jīng)分配,但是沒(méi)有初始化;
VectorXfb(30);//大小為30的向量,數(shù)組內(nèi)存已經(jīng)分配,但是元素沒(méi)有初始化。

或者更通用的:

MatrixVector3f_def;

矩陣初始化

在構(gòu)造完后,我們需要對(duì)元素進(jìn)行初始化,常用的是直接賦值:

Eigen::Matrix3fm;
m<

它是逐行寫(xiě)入的,這只適用于較小的矩陣:

Eigen::MatrixXdm(3,3);
m<<1,2,3,?????4,5,6,?????7,8,9;

對(duì)于向量,還可以在構(gòu)造的時(shí)候初始化:

Vector3dv(1,2,3);
Vector3dw(1,0,0);

還有一些特殊函數(shù),函數(shù):

MatrixXf::Zero(3,4);//將矩陣3行4列初始化為0
MatrixXf::Ones(3,3);//將矩陣3行3列初始化為1
Vector3f::Ones();//將3行的縱向量初始化為1
MatrixXi::Identity(3,3);//單位矩陣
Matrix3d::Random();//隨機(jī)矩陣

03 矩陣索引

當(dāng)前矩陣的行數(shù)、列數(shù)、大小可以通過(guò)rows()、cols()和size()來(lái)獲取。遍歷Eigen矩陣時(shí)最好通過(guò)rows和cols來(lái)限制訪問(wèn)范圍,索引的方法如下:

1、矩陣訪問(wèn)按照先索引、后索引方式進(jìn)行,索引下標(biāo)從0開(kāi)始(與Matlab不同);

2、矩陣元素的訪問(wèn)可以通過(guò)**”( )”操作符完成。例如m(2, 3)**,矩陣m的第2行第3列元素;

3、針對(duì)向量還提供”**[ ]”操作符,注意矩陣則不可**如此使用。

resize:不同于matlab、Python,對(duì)于動(dòng)態(tài)矩陣雖然可以通過(guò)resize()函數(shù)來(lái)動(dòng)態(tài)修改矩陣的大小,但是需要說(shuō)明的是,在Eigen中:

不能用:固定大小的矩陣是不能使用resize()來(lái)修改矩陣的大??;

數(shù)據(jù)會(huì)變:resize()函數(shù)會(huì)析構(gòu)掉原來(lái)的數(shù)據(jù),變?yōu)?.,因此最好使用:conservativeResize()函數(shù)

大小修改:使用”=”操作符操作動(dòng)態(tài)矩陣時(shí),如果左右兩邊的矩陣大小不等,則左邊的動(dòng)態(tài)矩陣的大小會(huì)被修改為右邊的大小。

利用block()函數(shù),可以從Matrix中取出一個(gè)小矩陣來(lái)進(jìn)行處理,使用的語(yǔ)法為:

matrix.block(i,j);

例如:

Eigen::MatrixXfm(4,4);
m<(1,1)<

單獨(dú)的列和行是塊的特殊情況。Eigen提供了可以輕松解決它們的方法:.col()和.row():

Eigen::MatrixXim(2,2);
m<

04 數(shù)學(xué)運(yùn)算

4.1 加減法

Eigen幫我們重載了,直接運(yùn)算:

Vector3dv(1,2,3);
Vector3dw(1,0,0);
cout<

4.2 乘除法

除法:通常我們是除以標(biāo)量。對(duì)于矩陣除法,我們是求它的逆,再轉(zhuǎn)換為矩陣乘法。因此較為簡(jiǎn)單:

Vector3dv(1,2,3);
Vector3dr=v/3;
cout<

矩陣乘法:*

乘法,標(biāo)量非常簡(jiǎn)單:

cout<
Matrix2dmat;
mat<

補(bǔ)充:轉(zhuǎn)置

向量、矩陣的乘法,因?yàn)樾枰猻ize一致,因此需要用到轉(zhuǎn)置:

MatrixXcfa=MatrixXcf::Random(2,2);//MatrixXcf為復(fù)數(shù)矩陣
cout<

需要說(shuō)明的是,在Eigen中,對(duì)于自身的操作,都有專(zhuān)門(mén)的函數(shù),例如對(duì)自身的轉(zhuǎn)置:

a.transposeInPlace();//直接在a上操作

點(diǎn)乘和叉乘

Vector3dv(1,2,3);
Vector3dw(0,1,2);
//點(diǎn)乘
cout<

在Eigen中,向量的叉乘只支持三維的向量,這是因?yàn)椴娉送ǔS糜谟?jì)算方向、夾角等,它的計(jì)算規(guī)則如下:

4.3 特征運(yùn)算

//Eigenalsoprovidessomereductionoperationstoreduceagivenmatrixorvectortoasinglevalue
//suchasthesum(computedbysum()),product(prod()),orthemaximum(maxCoeff())andminimum(minCoeff())ofallitscoefficients.
Eigen::Matrix2dmat;
mat<

05 通用數(shù)組

Array類(lèi)提供了通用數(shù)組。此外,Array類(lèi)提供了一種執(zhí)行逐系數(shù)運(yùn)算的簡(jiǎn)便方法,該運(yùn)算可能沒(méi)有線性代數(shù)含義,例如將常數(shù)添加到數(shù)組中的每個(gè)系數(shù)或按系數(shù)乘兩個(gè)數(shù)組。

注:Eigen計(jì)算三角函數(shù)等,Matrix并不支持,需要通過(guò).array()轉(zhuǎn)換到Array類(lèi),再計(jì)算!

m1.array().atan();

常見(jiàn)數(shù)據(jù)類(lèi)型

ArrayArrayXf
ArrayArray3f
ArrayArrayXXd
ArrayArray

常見(jiàn)操作:

//逐元素操作Vectorizedoperationsoneachelementindependently
//Eigen//Matlab//注釋
R=P.cwiseProduct(Q);//R=P.*Q//逐元素乘法
R=P.array()*s.array();//R=P.*s//逐元素乘法(s為標(biāo)量)
R=P.cwiseQuotient(Q);//R=P./Q//逐元素除法
R=P.array()/Q.array();//R=P./Q//逐元素除法
R=P.array()+s.array();//R=P+s//逐元素加法(s為標(biāo)量)
R=P.array()-s.array();//R=P-s//逐元素減法(s為標(biāo)量)
R.array()+=s;//R=R+s//逐元素加法(s為標(biāo)量)
R.array()-=s;//R=R-s//逐元素減法(s為標(biāo)量)
R.array()

06 更多操作

對(duì)于Eigen,它適合一個(gè)簡(jiǎn)單的數(shù)值計(jì)算庫(kù),并沒(méi)有什么實(shí)用技巧。其實(shí)大多數(shù)時(shí)候,你只需要利用Google和百度去查詢你需要的操作即可!對(duì)于更多的操作,可以參考:Eigen 常用函數(shù)查詢,對(duì)比MatLab操作 。
責(zé)任編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8254

    瀏覽量

    149942
  • 模板
    +關(guān)注

    關(guān)注

    0

    文章

    107

    瀏覽量

    20531
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2085

    瀏覽量

    73301

原文標(biāo)題:06 更多操作

文章出處:【微信號(hào):3D視覺(jué)工坊,微信公眾號(hào):3D視覺(jué)工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    線性代數(shù)要和科學(xué)計(jì)算結(jié)成好伙伴(稿)

    在科學(xué)研究中,逐漸發(fā)現(xiàn)線性代數(shù)用的越來(lái)越多,在老師的博客里發(fā)現(xiàn)了這篇文章,覺(jué)得很不錯(cuò),因此放在這里,希望大家能有所收獲。在此,也貼出我們矩陣?yán)碚摾蠋煹牟┛偷刂穐ttp
    發(fā)表于 10-29 22:03

    labview線性代數(shù)求解輸入控件如何輸入未知變量

    labview線性代數(shù)求解輸入控件如何輸入未知變量
    發(fā)表于 04-07 09:11

    線性代數(shù)超強(qiáng)總結(jié)

    線性代數(shù)超強(qiáng)總結(jié)
    發(fā)表于 05-26 07:26

    程序世界:線性代數(shù)是一種特定語(yǔ)言

    、矩陣乘法等語(yǔ)義概念相應(yīng)的語(yǔ)法編譯/解釋?zhuān)篠QL可以被編譯/解釋為C語(yǔ)言;線性代數(shù)相關(guān)概念和運(yùn)算規(guī)則可以由初等數(shù)學(xué)知識(shí)來(lái)解釋實(shí)現(xiàn):我們可以在MySQL、Oracle等關(guān)系數(shù)據(jù)庫(kù)上進(jìn)行SQL編程;我們也
    發(fā)表于 04-22 06:30

    線性代數(shù)實(shí)踐及MATLAB入門(mén)》第二版《線性代數(shù)實(shí)踐》課件

    線性代數(shù)實(shí)踐及MATLAB入門(mén)》第二版《線性代數(shù)實(shí)踐》課件:第六章 用行階梯法解方程組第7章  矩陣運(yùn)算法解方程第十章  后續(xù)課矩陣建模舉例第二篇  線性代數(shù)實(shí)
    發(fā)表于 10-24 08:49 ?0次下載

    對(duì)線性代數(shù)課程大綱的建議

    對(duì)線性代數(shù)課程大綱的建議 致基礎(chǔ)數(shù)學(xué)分教指委一.問(wèn)題的提出:現(xiàn)在的“線性代數(shù)”大綱不能滿足后續(xù)課的要求。為后續(xù)課程打好基礎(chǔ),應(yīng)該成為任何
    發(fā)表于 05-26 16:59 ?5次下載

    Matlab線性代數(shù)實(shí)驗(yàn)

    Matlab線性代數(shù)實(shí)驗(yàn)8.1 實(shí)驗(yàn)(Ⅰ):用Matlab學(xué)線性代數(shù)8.1.1實(shí)驗(yàn)與觀察:向量組的線性關(guān)系和解線性方程組1.  用線性
    發(fā)表于 10-17 00:36 ?1996次閱讀

    Linear_Algebra_線性代數(shù)(美版教材--習(xí)題答案)

    英文線性代數(shù)電子書(shū)
    發(fā)表于 09-04 10:42 ?0次下載

    工程線性代數(shù)matlab版

    MATLAB,工程線性代數(shù)matlab版。
    發(fā)表于 12-21 14:41 ?0次下載

    線性代數(shù)相關(guān)的基本知識(shí)

    線性代數(shù)包含了關(guān)于矩陣的所有相關(guān)的基本知識(shí),可以快速學(xué)習(xí),適合自學(xué)。
    發(fā)表于 12-22 17:58 ?0次下載

    線性代數(shù)教材(同濟(jì)四版)

    線性代數(shù)教材(同濟(jì)四版),有需要的下來(lái)看看
    發(fā)表于 03-22 11:13 ?0次下載

    機(jī)器學(xué)習(xí)線性代數(shù)基礎(chǔ)

    機(jī)器學(xué)習(xí)所需要的一些線性代數(shù)知識(shí)
    發(fā)表于 09-04 10:08 ?0次下載

    線性代數(shù)是什么?存在的意義是什么?

    在大學(xué)數(shù)學(xué)學(xué)科中,線性代數(shù)是最為抽象的一門(mén)課,從初等數(shù)學(xué)到線性代數(shù)的思維跨度比微積分和概率統(tǒng)計(jì)要大得多。
    的頭像 發(fā)表于 08-19 10:24 ?29.5w次閱讀
    <b class='flag-5'>線性代數(shù)</b>是什么?存在的意義是什么?

    PyTorch教程2.3之線性代數(shù)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程2.3之線性代數(shù).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 11:32 ?1次下載
    PyTorch教程2.3之<b class='flag-5'>線性代數(shù)</b>

    線性代數(shù)和矩陣計(jì)算

    MATLAB提供了豐富的功能來(lái)進(jìn)行線性代數(shù)和矩陣計(jì)算。下面是一些常用的示例。
    的頭像 發(fā)表于 07-07 09:56 ?1009次閱讀