專案要進行比較多的矩陣操作,特別是二維矩陣。剛開始做實驗時,使用了動態二維陣列,於是寫了一堆matrix函式,作矩陣的乘除加減求逆求行列式。實驗做完了,開始做**優化,發現matrix.h檔案裡適用性太低,而且動態二維陣列的空間分配與釋放也影響效率,於是尋找其他解決方案。
首先考慮的是與matlab混合程式設計,折騰了半天把matlab環境與vs2010環境之後,發現matlab編譯出來的函式使用起來也比較麻煩,要把陣列轉化成該函式適用的型別後才能使用這些函式。我的二維陣列也不是上千萬維的,估計這個轉化的功夫就犧牲了一部分效率了。(如果誰有混合程式設計的心得,求幫忙,囧。。。)
接著想到使用一維陣列的方法,或者把一維陣列封裝在乙個類裡邊。想著又要寫一堆矩陣操作函式頭就大,索性谷歌了一下矩陣處理庫,除了自己之前知道的opencv庫(之前由於轉化cvarr麻煩,於是放棄),還有eigen, armadillo。
該部落格對這三個庫的效率做了乙個簡單的評測,opencv庫的矩陣操作效率是最低的,還好我沒使用。eigen速度最快,與自己定義陣列的操作效率相當(- -,才相當嗎?我本來還想找個更快的呢)。於是選擇使用eigen。
進入正題。
安裝:簡單使用:
看了一下官方文件,eigen庫除了能實現各種矩陣操作外,貌似還提供《數學分析》中的各種矩陣操作(包括l矩陣u矩陣)。目前我使用到的還是簡單的矩陣操作,如加減乘除,求行列式,轉置,逆,這些基本操作只要:
[cpp]view plain
copy
print?
#include "eigen/eigen"
using namespace eigen;
就能實現,別忘了名空間eigen。
包含的型別:
matrices
arrays
matrix<=> matrixxf
matrix<=> vectorxd
matrix<=> rowvectorxi
matrix<=> matrix3f
matrix<=> vector4f
array<=> arrayxxf
array<=> arrayxd
array<=> rowarrayxi
array<=> array33f
array<=> array4f
如上表,主要包括兩種型別,matrices與arryays,接著是這兩種型別的派生型別。現在我用到的是matrices(我不明白這兩種型別在效率間有什麼差距,囧。。。),
其中matrix代表二維矩陣,vector代表列向量rowvector代表行向量。如果後面跟著x,則代表是動態的陣列,執行時可以根據需求改變,如果是數字,則代表是靜態的(根據實驗,最多能建立4維的靜態矩陣或者陣列,- -,為嘛不是6維,實驗正好需要)。i代表int型別,f代表float型別,d代表double。
對應關係:
matrix
二維矩陣
vector
列向量rowvector
行向量x
動態固定數字n
靜態,4>=n>=1
iint
ffloat
ddouble
arrays型別的話也跟matrices差不多。
基本操作,定義,初始化,矩陣操作:
[cpp]view plain
copy
print?
#include #include "eigen/eigen"
using namespace std;
using namespace eigen;
void foo(matrixxf& m)
int main()
去**更深入學習?
C 矩陣處理庫 Eigen初步使用
專案要進行比較多的矩陣操作,特別是二維矩陣。剛開始做實驗時,使用了動態二維陣列,於是寫了一堆matrix函式,作矩陣的乘除加減求逆求行列式。實驗做完了,開始做 優化,發現matrix.h檔案裡適用性太低,而且動態二維陣列的空間分配與釋放也影響效率,於是尋找其他解決方案。首先考慮的是與matlab混合...
Eigen初步1 初步體驗Eigen庫
前言 eigen 是乙個線性算術的c 模板庫,包括 vectors,matrices,開源以及相關演算法。功能強大 快速 優雅以及支援多平台,可以使用該庫來方便處理一些矩陣的操作,達到類似matlab那樣的快捷。現在已經發展到eigen3了,目前最新版本為eigen 3.1.2。eigen使用預備工...
Qt使用Eigen矩陣庫
eigen官網 解壓後放在任意資料夾內,然後在qt專案中的pro檔案中加上eigen的目錄 如果沒有載入成功,重新構築即可 includepath d eigen3新增標頭檔案 include定義向量 字尾是變數型別,例如float矩陣是matrix2f vector2d a 5.0,6.0 cou...