有關eigen庫的一些簡單用法

2021-08-20 09:05:15 字數 3502 閱讀 5104

eigen

是乙個輕量級的矩陣庫,除了稀疏矩陣不成熟(3.1有較大改進)以外,其他的矩陣和向量操作都比較完善,而且速度不錯.

不支援vc6.0,vs最低版本支援2003(打補丁),最好是2005以上.

在eigen 3.1.3

eigendemo.zip

示例是vs2010環境下的程式,主要的檔案就只有main.cpp和eigen資料夾。

#include #include "eigen/dense"

using namespace eigen;

int main()

使用map函式,可以實現eigen的矩陣和c++中的陣列直接轉換,語法如下:

//@param matrixtype 矩陣型別

//@param mapoptions 可選引數,指的是指標是否對齊,aligned, or unaligned. the default is unaligned.

//@param stridetype 可選引數,步長

/* map*/

int i;

//陣列轉矩陣

double

*amat = new double[20

];for(i =

0;i<

20;i++

)//靜態矩陣,編譯時確定維數 matrix

eigen:mapdouble,4

,5>

> stamat(amat)

;//輸出

for(

int i =

0; i < stamat.size()

; i++

) std::

cout

<<

*(stamat.data()

+ i)

<<

" ";

std::

cout

<< std::

endl

<< std::

endl

;//動態矩陣,執行時確定 matrixxd

map dymmat(amat,4,

5);//輸出,應該和上面一致

for(

int i =

0; i < dymmat.size()

; i++

) std::

cout

<<

*(dymmat.data()

+ i)

<<

" ";

std::

cout

<< std::

endl

<< std::

endl

;//matrix為列優先,如下返回指標

dymmat.data()

;

eigen過載了基礎的+ - * / += -= *= /= *可以表示標量和矩陣或者矩陣和矩陣

#include 

#include

using namespace eigen;

int main(

)*/

小矩陣(4 * 4及以下)eigen會自動優化,預設採用lu分解,效率不高

#include #include using namespace std;

using namespace eigen;

int main()

#include 

#include

using namespace std;

using namespace eigen;

int main(

)

除了colpivhouseholderqr、llt、ldlt,還有以下的函式可以求解線性方程組,請注意精度和速度: 解小矩陣(4*4)基本沒有速度差別

decomposition

method

矩陣特殊要求

速度精度

partialpivlu

partialpivlu()

可逆++

+fullpivlu

fullpivlu()

none

-+++

householderqr

householderqr()

none+++

colpivhouseholderqr

colpivhouseholderqr()

none+++

fullpivhouseholderqr

fullpivhouseholderqr()

none

-+++

lltllt()

正定+++

+ldlt

ldlt()

正或負半定 positive or negative semidefinite

+++++

最小二乘求解有兩種方式,jacobisvd或者colpivhouseholderqr,4*4以下的小矩陣速度沒有區別,jacobisvd可能更快,大矩陣最好用colpivhouseholderqr

#include 

#include

using namespace std;

using namespace eigen;

int main(

)

稀疏矩陣的標頭檔案包括:

#include #include #include #include
初始化有兩種方式: 1.使用三元組插入

typedef eigen::

triplet

t;std::

vector

tripletlist;

triplets.reserve

(estimation_of_entries)

;//estimation_of_entries是預估的條目

for(...)

sparsematrixtype mat(rows,cols)

;mat.setfromtriplets

(tripletlist.begin()

, tripletlist.end()

);// mat is ready to go!

2.直接將已知的非0值插入

sparsematrix mat(rows,cols)

;mat.reserve

(vectorxi::

constant

(cols,6)

);for(...)

mat.makecompressed()

;// optional

稀疏矩陣支援大部分一元和二元運算:

sm1.real() sm1.imag() -sm1 0.5*sm1

sm1+sm2 sm1-sm2 sm1.cwiseproduct(sm2)

二元運算中,稀疏矩陣和普通矩陣可以混合使用

//dm表示普通矩陣

dm2 = sm1 + dm1;

也支援計算轉置矩陣和伴隨矩陣

Substring 的一些簡單用法

string teststring abc def teststring.substring 2 return c def teststring.substring teststring.lastindexof 1 return def teststring.substring teststring...

LINQ to SQL的一些簡單用法

static void main string args new person 新建乙個list,事先存放一些資料 var a personlist.firstordefault 獲取personlist中第一條資料 var b personlist.where p p.personid 2 fir...

python dict的一些簡單用法

我以為我dict用的很熟了,但是真正再去用的時候發現還是底子太薄,太多地方容易出錯了 d dict or 更簡單 d 這樣建立了乙個新的dict,不包含任何key,value if d.han key key do something.乙個例子 比如說我有乙個list,裡面有重複的元素,我要統計所有...