Eigen庫的優化技巧

2021-10-03 22:56:32 字數 3184 閱讀 7547

eigen::matrixxd jacobian_i = eigen::matrixxd::random(10, 10);//動態

matrixjacobian_i; //靜態

eigen::matrixjacobian_i;//靜態

參考:

eigen_cglibs_giugno_pisa_2013

官方文件

知乎回答

lazy evalution,減少中間變數。其中的運算子過載,並不返回矩陣值,而是返回乙個計算表示類。最終的運算是在賦值等號operator =中進行的,這裡的過載符號解釋了計算表示類,然後進行矩陣運算。緩式評估的優點是計算速度快,避免多次的臨時變數的建立與析構。

用靜態記憶體代替動態記憶體,靜態記憶體分配在棧上,位址連續(可能觸發simd),動態記憶體new在堆上,位址不連續

sse加速,記憶體對齊(internal裡面自己分配記憶體),traits技術模板中獲得資料型別

常用語句-與matlab對應

常見用法

1.模組和標頭檔案

普通矩陣運算,不包含svd等,只需要包含:

#include

如果進行svd,則加上

#include

如果不能進行求絕對值、逆矩陣運算,加上

#include

如果不嫌棄編譯速度慢,就全加上

#include

還需要稀疏矩陣的話,使用

#include

這樣,全部庫都加進去了

2.混淆問題

3. map類

定義:map>

mapmapoptions標識指標是否是對齊的(aligned),預設是unaligned。

stridetype表示記憶體陣列的組織方式:行列的步長。

map沒有預設的建構函式,你需要傳遞乙個指標來初始化物件。

int array[8]

;for

(int i =

0; i <8;

++i) array[i]

= i;

cout <<

"column-major:\n"

<< map

int,2,

4>

>

(array)

<< endl;

cout <<

"row-major:\n"

<< map

int,2,

4,rowmajor>

>

(array)

<< endl;

cout <<

"row-major using stride:\n"

<<

mapint,2,

4>

, unaligned, stride<1,

4>

>

(array)

<< endl;

輸出:column-major:02

4613

57row-major:01

2345

67row-major using stride:01

2345

67

為了構建map變數,我們需要其餘的兩個資訊:乙個指向元素陣列的指標,matrix/vector的尺寸。定義乙個float型別的矩陣: map mf(pf,rows,columns); pf是乙個陣列指標float *。

固定尺寸的整形vector宣告: map mi(pi);

int data=

; map

v(data,4)

; cout <<

<< v <<

"\n"

;new

(&v) map

(data+4,

5);

cout <<

"now v is: "

<< v <<

"\n"

;輸出:12

34now v is:56789

常用矩陣

單位矩陣:matrix3d::identity();

全1矩陣:matrix3d::ones();

零矩陣:matrix3d::zero();

隨機矩陣:matrix3d::random();

參考:

記憶體對齊參考部落格

對齊規則:

假設m= min(#pragma pack()指定的數,這個資料成員的自身長度)

#pragma pack(n) 表示設定為n位元組對齊。 vc6預設8位元組對齊

1、 對於結構的各個成員,第乙個成員位於偏移為0的位置,以後每個資料成員的偏移量必須是m的倍數。

2、 在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。必須是最小的倍數

3、結合1、2推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

4.各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數。

5.各成員變數在存放的時候根據在結構**現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的位元組自動填充。

6.同時為了確保結構的大小為結構的位元組邊界數(即該結構中占用最大空間的型別所占用的位元組數)的倍數,所以在為最後乙個成員變數申請空間後,還會根據需要自動填充空缺的位元組。

7. sizeof(union),以結構裡面size最大元素為union的size,因為在某一時刻,union只有乙個成員真正儲存於該位址。

優點:2、 效能原因:經過記憶體對齊後,cpu的記憶體訪問速度大大提公升

布局技巧:

按資料型別的長度排序 ;把結構體的成員按照它們的型別長度排序,宣告成員時把長的型別放在短的前面。編譯器要求把長型資料型別存放在偶數字址邊界。在申明乙個複雜的資料型別 (既有多位元組資料又有單位元組資料) 時,應該首先存放多位元組資料,然後再存放單位元組資料,這樣可以避免記憶體的空洞。

提高c++**效率的一些技巧

Eigen 庫的配置

eigen 是乙個基於c 模板的線性代數庫。據說使用起來很方便和matlab的矩陣操作有的一比,以前也沒用過,今天閒來沒事搞搞看看,實驗後的感覺還不錯。因此把這個庫從安裝到簡單示例記錄一下。3 寫乙個簡單驗證程式示例一下 我的eigen庫是放在e software下的 include e softw...

Eigen初步1 初步體驗Eigen庫

前言 eigen 是乙個線性算術的c 模板庫,包括 vectors,matrices,開源以及相關演算法。功能強大 快速 優雅以及支援多平台,可以使用該庫來方便處理一些矩陣的操作,達到類似matlab那樣的快捷。現在已經發展到eigen3了,目前最新版本為eigen 3.1.2。eigen使用預備工...

Eigen庫的簡單使用

eigen是乙個c 開源線性代數庫。提供有關矩陣的的線性代數運算,解方程等功能。官方的文件在此,本文是簡單的使用,以slam十四講 閱讀,快速入門。sudo apt get install libeigen3 dev module contents include matrix and array ...