大家推薦乙個矩陣類?

時間 2021-05-30 08:38:59

1樓:Carpathia

我是由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論壇的專有頁面,非常豐富的解答。

2樓:

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

Armadillo比Eigen好的地方:

資料型別豐富,除了一維向量和二維矩陣以外還有三維的cube, 以及field(一種可以盛放向量、矩陣、cube或者field本身的容器)這個大殺器,很多規模稍大的程式有了field這個抽象層以後寫起來舒服多了。相比之下Eigen只有一維向量和二維矩陣,然後就是一堆畫蛇添足的"Vector3d", "Vector4d"這種玩意或者是Map這種不明覺厲,難學難用的東西。

Armadillo有各種各樣的矩陣函式,豐富程度堪比Matlab,裡面連卷積神經網路必備的的conv()和kron()這種函式都提供給你了。Armadillo的函式還有乙個好處就是語義基本都和Matlab一致,手上只有Matlab程式的時候,可以借助Armadillo很快轉化成對應的C++程式。相比之下Eigen的矩陣函式少得可憐,真要用Eigen庫還得造些輪子。

Armadillo有C++風格的迭代器,各種資料型別都有對應的迭代器,可以在元素、行、列之間迭代,連field都有迭代器。迭代器+lambda+algorithm庫里的泛型演算法寫得飛起好嗎。Eigen嘛,只有乙個可憐兮兮的data()成員函式提供了指向資料塊的頭指標。

Eigen暴露太多實現細節給使用者。比如array()、上文提到的Map這類成員,還有和std庫里容器配合使用時的各種對齊問題。

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

3樓:Pi Exp

強烈推薦armadillo!!用法和matlab語法差不多,很容易上手,搭配openblas據說是目前最快的!唯一的缺點就是文件資料略顯少,不過基本也夠了。

還有乙個很著名的叫做"Eigen",速度也巨快,而且完全是基於模版元程式設計實現,不依賴任何庫(armadillo也可以不依賴別的庫,但是效率會受影響,一些功能性函式也用不了),還有一點是,Eigen的文件資料巨豐富。

4樓:半獸人

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

請問乙個普通的矩陣(比如乙個二階矩陣)能作為乙個向量嗎?

天下無難課 向量 是乙個陣列,就是把n個數組成乙個運算的基本單位,而線性組合就是用幾個這類陣列加起來,形成乙個新的陣列 向量 矩陣是啥?就是你選定幾個陣列,然後用乙個方框把它們框起來,那意思是我就要用這些陣列來做組合了。但是,每次做組合 向量加法 時所用的係數 由向量x來表達 或不同。所以,在y A...

兩矩陣正交,是否可以推出乙個矩陣的任意行向量與另乙個矩陣的任意列向量垂直?

天下無難課 題主會不會把概念搞混了?題主這裡說的列向量與行向量相乘是內積吧?如果兩個向量正交,它們的內積為0。題主似乎是把這兩個向量正交時內積為0的概念推廣到矩陣相乘上去了吧?矩陣相乘的結果是乙個矩陣,向量內積的結果是乙個數,這個數為0就說明兩向量正交。題主可能就到過來用,說這個兩個矩陣正交了,就該...

怎麼證明若A是乙個可逆矩陣,若矩陣H滿足 H A 1 1,則A H可逆。

王箏 鑑於另乙個答案的問題,我先明確一些定義。本來這些定義都是眾所周知的。假設 是線性空間,我們稱 是 上的乙個範數,如果滿足 正定 範數大於等於零,等於零當且僅當零元素 齊次 乘常數的話範數也乘該常數的模 三角不等式 額外地,如果我們假設 是個代數 有乘法結構,有單位 那麼我們稱這個範數是sub ...