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

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

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

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

3D視覺工坊 ? 來源:3D視覺工坊 ? 2023-06-25 10:28 ? 次閱讀

00 Eigen簡介

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

Eigen庫的優(yōu)點:

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

OpenCV自帶到Eigen的接口。

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

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

支持多線程,對稀疏矩陣支持良好。

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

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

01 數(shù)據(jù)類型

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

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

其中:

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

后三個參數(shù):默認即可,無需指定

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

typedefMatrixMatrix4f;

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

typedefMatrixVector3f;

行向量RowVector:

typedefMatrixRowVector2i;

靜態(tài)-動態(tài)-矩陣

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

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

數(shù)據(jù)類型

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

d:表示double類型

f:表示float類型

i:表示整數(shù)

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

舉例:Matrix2f,表示的是一個維的,其每個元素都是float類型。

02 新建矩陣

矩陣構(gòu)造

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

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

對于動態(tài)數(shù)組,你也可以直接分配大?。ㄊプ饔昧耍?,同樣沒有初始化矩陣元素:

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

或者更通用的:

MatrixVector3f_def;

矩陣初始化

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

Eigen::Matrix3fm;
m<

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

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

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

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();//隨機矩陣

03 矩陣索引

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

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

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

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

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

不能用:固定大小的矩陣是不能使用resize()來修改矩陣的大?。?/p>

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

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

利用block()函數(shù),可以從Matrix中取出一個小矩陣來進行處理,使用的語法為:

matrix.block(i,j);

例如:

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

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

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

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

4.1 加減法

Eigen幫我們重載了,直接運算:

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

4.2 乘除法

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

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

矩陣乘法:*

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

cout<
Matrix2dmat;
mat<

補充:轉(zhuǎn)置

向量、矩陣的乘法,因為需要size一致,因此需要用到轉(zhuǎn)置:

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

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

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

點乘和叉乘

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

在Eigen中,向量的叉乘只支持三維的向量,這是因為叉乘通常用于計算方向、夾角等,它的計算規(guī)則如下:

4.3 特征運算

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

05 通用數(shù)組

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

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

m1.array().atan();

常見數(shù)據(jù)類型

ArrayArrayXf
ArrayArray3f
ArrayArrayXXd
ArrayArray

常見操作:

//逐元素操作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 更多操作

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

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

    關(guān)注

    33

    文章

    8667

    瀏覽量

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

    關(guān)注

    0

    文章

    108

    瀏覽量

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

    關(guān)注

    22

    文章

    2113

    瀏覽量

    73742

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

    在科學(xué)研究中,逐漸發(fā)現(xiàn)線性代數(shù)用的越來越多,在老師的博客里發(fā)現(xiàn)了這篇文章,覺得很不錯,因此放在這里,希望大家能有所收獲。在此,也貼出我們矩陣理論老師的博客地址http
    發(fā)表于 10-29 22:03

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

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

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

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

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

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

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

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

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

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

    Matlab線性代數(shù)實驗

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    摩爾線程開源高性能線性代數(shù)模板MUTLASS

    近日,摩爾線程宣布開源高性能線性代數(shù)模板MUTLASS,以便開發(fā)者能夠更高效針對摩爾線程全功能GPU的MUSA Core及Tensor Core等單元進行編程,加速基于國產(chǎn)GPU的算子開發(fā)以及算法創(chuàng)新。
    的頭像 發(fā)表于 11-13 11:53 ?352次閱讀