C 矩陣計算庫 Eigen 使用筆記(一)

2021-07-06 04:42:54 字數 1679 閱讀 6299

1. intel math kernel library 的呼叫

在 #include 任何 eigen 庫的標頭檔案之前,定義巨集

#define eigen_use_mkl_all
可以根據自己的需要單獨定義所需的 mkl 部分。可用的巨集是

eigen_use_blas

使用 blas level 2 與 blas level 3 的演算法;

eigen_use_lapacke

通過 intel mkl c 介面,使用擴充套件的 lapack 演算法;

eigen_use_lapacke_strict

使用更加穩定的 lapack 演算法(比如用 gesvd 代替 jacobi 旋轉),一般情況下無需使用此選項;

eigen_use_mkl_vml

使用 mkl 函式的向量化優化;

eigen_use_mkl_all

相當於同時定義了 eigen_use_blas, eigen_use_lapacke 和 eigen_use_mkl_vml.

務必注意,巨集的定義必須在引用任何 eigen 標頭檔案之前,否則呼叫是無效的。64位作業系統上的 mkl 資料型別介面選擇 lp64,eigen 暫時不支援 ilp64 型別。

intel math kernel library 的庫檔案鏈結方法,可以參考 intel mkl linking advisor,位址是

vector& vector::normalize();
對 *this 向量(列向量與行向量均可)進行單位化(即歸一化)。此操作會直接改變 *this 向量自身。

vector& matrix::col(std::size_t index);

const vector& matrix::col(std::size_t index) const;

類 matrix 的成員函式。返回值為 *this 的 matrix 中第 index 列列向量的引用,此列向量可以作為右值賦值給乙個大小為 *this 矩陣的行數的 vector 類物件,也可以作為左值被乙個同樣大小的 vector 類物件賦值。

例子:

//定義 3x3 矩陣 m 為單位矩陣

matrix3d m = matrix3d::identity();

//函式 m.col(1) 返回對矩陣 m 第 2 列(從 0 開始)列向量的引用,並且用乙個新的列向量對此列賦值

//最終 m 的數值為 , , }

m.col(1) = vector3d(4, 5, 6);

可以和 vector& vector::normalize() 聯用。即

m.col(1).normalize()
表示對矩陣 m 列標為 1 的列向量進行單位化。

void orthonormalize(eigen::matrixxd& colvecs)

colvecs.col(k + 1).normalize();

}}

matrixxd eigen_vals_diag(vector.asdiagonal());
生成的對角矩陣名為 eigen_vals_diag, 由向量(列向量或者行向量均可)vector 中的元素構建。

C 矩陣處理庫 Eigen初步使用

專案要進行比較多的矩陣操作,特別是二維矩陣。剛開始做實驗時,使用了動態二維陣列,於是寫了一堆matrix函式,作矩陣的乘除加減求逆求行列式。實驗做完了,開始做 優化,發現matrix.h檔案裡適用性太低,而且動態二維陣列的空間分配與釋放也影響效率,於是尋找其他解決方案。首先考慮的是與matlab混合...

C 矩陣處理庫 Eigen初步使用

專案要進行比較多的矩陣操作,特別是二維矩陣。剛開始做實驗時,使用了動態二維陣列,於是寫了一堆matrix函式,作矩陣的乘除加減求逆求行列式。實驗做完了,開始做 優化,發現matrix.h檔案裡適用性太低,而且動態二維陣列的空間分配與釋放也影響效率,於是尋找其他解決方案。首先考慮的是與matlab混合...

Qt使用Eigen矩陣庫

eigen官網 解壓後放在任意資料夾內,然後在qt專案中的pro檔案中加上eigen的目錄 如果沒有載入成功,重新構築即可 includepath d eigen3新增標頭檔案 include定義向量 字尾是變數型別,例如float矩陣是matrix2f vector2d a 5.0,6.0 cou...