大家推薦一個矩陣類?

我用的是VC2010,請大家推薦一個比較官方的矩陣類吧。
目前我知道有MTL、Meschach、Blitz等等,不知有沒有人用過,請介紹一下經驗。
希望能有一些矩陣的運算功能,諸如LU、SVD什麼的最好有自帶函數,就跟Matlab似的,運算速度沒有硬性要求,但也別太慢,至少得拼得過Matlab吧。
謝謝各位!

補充一下,需要是開源的。另外,希望自帶有各種方程組解法,如共軛梯度、LSQR等。


如果你有Matlab的話
是可以二次開發和混合編程的
用c/c++調用matlab引擎或者用matlab生成dll

有一個通用的數學演算法庫 NAG,包含矩陣數值統計等等,據說挺專業

不過上面都是有商業的,開源的話有
Armadillo C++ Library
Octave
boost matrix
不過都沒用過

如果有特殊的用途可以參考
c/c++數學計算庫


強烈推薦armadillo!!用法和matlab語法差不多,很容易上手,搭配openblas據說是目前最快的!唯一的缺點就是文檔資料略顯少,不過基本也夠了。還有一個很著名的叫做"Eigen",速度也巨快,而且完全是基於模版元編程實現,不依賴任何庫(armadillo也可以不依賴別的庫,但是效率會受影響,一些功能性函數也用不了),還有一點是,Eigen的文檔資料巨豐富。


直接上Lapack吧,雖然它是傳統的函數實現,不是面向對象的。我現在用GotoBLAS感覺還可以,你在編譯的時候可以指定採用多核,還有選項針對不同的CPU架構進行優化。再要快的話可以去看看用了CUDA的一些庫。


這個?

Matrix - 1.42.0


我寫C++,先用過三個月的Eigen,然後換了Armadillo用到現在。強力推薦Armadillo,與之相比Eigen簡直就像個玩具程序一樣的。。
Armadillo比Eigen好的地方:

  1. 數據類型豐富,除了一維向量和二維矩陣以外還有三維的cube, 以及field(一種可以盛放向量、矩陣、cube或者field本身的容器)這個大殺器,很多規模稍大的程序有了field這個抽象層以後寫起來舒服多了。相比之下Eigen只有一維向量和二維矩陣,然後就是一堆畫蛇添足的"Vector3d", "Vector4d"這種玩意或者是Map這種不明覺厲,難學難用的東西。
  2. Armadillo有各種各樣的矩陣函數,豐富程度堪比Matlab,裡面連卷積神經網路必備的的conv()和kron()這種函數都提供給你了。Armadillo的函數還有一個好處就是語義基本都和Matlab一致,手上只有Matlab程序的時候,可以藉助Armadillo很快轉化成對應的C++程序。相比之下Eigen的矩陣函數少得可憐,真要用Eigen庫還得造些輪子。
  3. Armadillo有C++風格的迭代器,各種數據類型都有對應的迭代器,可以在元素、行、列之間迭代,連field都有迭代器。迭代器+lambda+algorithm庫里的泛型演算法寫得飛起好嗎。Eigen嘛,只有一個可憐兮兮的data()成員函數提供了指向數據塊的頭指針。
  4. Eigen暴露太多實現細節給用戶。比如array()、上文提到的Map這類成員,還有和std庫里容器配合使用時的各種對齊問題。

Eigen唯一的好處估計就是整個庫就幾個頭文件,無須配置環境吧。用Armadillo的話還要設置一下幾個基礎庫。


我是由Armadillo 轉 Eigen。上面有同學是 Eigen 轉 Armadillo的,談一下自己的幾點看法。
1. 關於數據類型,當然, Arma都有豐富如matlab的多維矩陣,個人理解多維的矩陣無非是二維矩陣的容器而已,因為二維以上的矩陣是沒有運算規則。Eigen專註於實用的線性代數所用的二維矩陣,如要容器則可使用vector&
關於上面同學提到的Vector3d等等,這個等同於Arma的 vec3等,是一些typedef 而已,大家都有,談何「畫蛇添足」。
並且Eigen的 Matrix2d,Matrix3d,Matrix4d 這種小的定長度矩陣配合SSE有超高的效率。
再有Map類型,我以為Map類型是非常好的引用地址構造矩陣的方法,強調了其引用特性,Arma也可以通過連續內存地址來構造引用矩陣,兩者功能一致。
2. 關於函數, 相比之下Arma 是比Eigen函數多一些,也更類似matlab,比如矩陣的非連續指標的引用,這個是arma的優勢。後來看到KDE論壇里Eigen開發者說不會提供效率不高的函數。所以有些函數缺失也是有原因的。(非連續指標引用的是非連續內存,讀取效率是不高的)
3. 關於Eigen的bug, 開始使用Eigen時是其bug 耿耿於懷,後來慢慢得明白這些bug的原因,還是跟效率有關。比如Aliasing 問題,恰恰是因為Eigen專註於效率,不肯加入臨時變數,所以才會弄出了「bug」,其實與其說bug ,不如說是用法不當。
Eigen確實存在內存對齊問題,不過都提供相應的簡單的解決方法。
4. 大家最關心的是效率,效率一直是Eigen最關注的東西,之前為了選擇矩陣庫,特意做過對比。組集一個稍大規模的有限元剛度矩陣(稀疏矩陣)。都用了各自的批量插入構造函數,演算法一模一樣,(由於Armadillo沒有lapack的話是沒有速度可言的,所以大家都使用了MKL), 結果是具體忘了,大概是Arma 4秒左右, Eigen 1秒左右。並且Eigen有沒有MKL速度差不多。
5. 關於和開發者的互動。 Eigen有KDE論壇的專有頁面,非常豐富的解答。


至少拼得過matlab。。。這真的不好辦了。。。

不相關,求摺疊。。。


Armadillo + intel MKL


至少拼過matlab,讓我瞬間感覺沒法推薦了


推薦閱讀:

矩陣的譜半徑怎麼求?
行列式與矩陣之間的深刻聯繫是什麼?
十天之內如何逆襲線性代數和高數?
標記 n 維空間中任意一個點/向量一定要用 n 個坐標嗎?
如何直觀地理解拉格朗日插值法?

TAG:數學 | 線性代數 | C | 矩陣運算 |