2009-08-14 86 views
3

我正在做一些線性代數數學,並且正在尋找一些非常輕量級且易於使用的矩陣類,它可以處理不同的維度:2x2,2x1,3x1和1x2。 我認爲這樣的類可以使用模板實現,並在某些情況下使用某些專業化來提高性能。有人知道任何可用的簡單實現嗎?我不想要「臃腫」的實現,因爲我會在內存受限的嵌入式環境中運行它。C++中的矩陣類

感謝

+2

這是另一個完整的lib,但可能太大(稱爲** eigen **):http://eigen.tuxfamily.org/index.php?title=Main_Page – 2009-08-14 23:09:26

+0

Eigen絕對是最好的庫。它不是太大,最重要的是爲小型固定尺寸矩陣進行模板化和優化。 – linello 2012-03-06 08:24:11

回答

6

你可以嘗試Blitz++ - 或Boost's uBLAS

+0

這兩個都很好。由於語法更簡單,我使用Boost的版本;儘管我相信閃電戰仍然有點快。請注意,大多數基準測試都集中在大型矩陣上,因爲高速緩存對奇特的內存訪問模式很重要 - 對於這種小矩陣,它可能不會。兩者在任何情況下都相當輕量級:廣泛的API幾乎是所有編譯時模板:編譯後的代碼不會包含任何不必要的額外字段,檢查或代碼。 – 2009-08-14 22:30:21

+0

謝謝,但那些比我需要的大一些。我只需要一些例子(如上所述4),因此使用完整的lib太多了。可能我正在尋找更多的類似愛好的實現,它提供了基本的案例。也許我必須自己做.. – 2009-08-14 22:32:26

+1

這取決於你,但我會注意到它使用庫幾乎總是更快。 (儘管對於業餘愛好,當然你會自己學習更多。)Boost的聲譽很棒,你不僅可以獲得UBLAS - 我推薦看看他們的其他產品。 BOOST_FOREACH獨自值得下載。 – 2009-08-14 23:44:30

1

的std :: valarray中是相當輕巧。

+0

我需要比原始數組更多的東西,比如尺寸檢查(即將1x2乘以2x2矩陣是可以的,但2x2與2x2不是),否則我幾乎要手動去做。 – 2009-08-14 22:33:40

1

我使用Newmat libraries進行矩陣計算。雖然我不確定它是否適合您的輕量級定義(它包含Visual Studio將其編譯到1.8MB靜態庫中的超過50個源文件),但它是開源且易於使用的。

0

我一個無法找到足夠簡單的庫,所以我自己寫的:http://koti.welho.com/aarpikar/lib/

我想應該能夠處理不同尺寸矩陣(2×2,3×3,3X1等),只需設置一些行或列爲零。它不會是最快的方法,因爲內部所有操作都將使用4x4矩陣完成。雖然理論上可能存在那種能夠在一個時鐘週期內處理4x4操作的處理器。至少我寧願​​相信存在這樣的處理器,而不是去優化那些低級別的矩陣計算。 :)

-1

如何只矩陣存儲在數組中,喜歡

2x3 matrix = {2,3,val1,val2,...,val6} 

這是非常簡單的,和加法運算是微不足道的。但是,您需要編寫自己的乘法函數。

5

我最近看了各種C++矩陣庫,我的投票去Armadillo

  • 圖書館是嚴重模板和頭只。
  • Armadillo還利用模板實現延遲評估框架(在編譯時解析)以最小化生成的代碼中的臨時對象(從而減少內存使用量並提高性能)。
  • 但是,這些高級功能只是編譯器的負擔,而不是您在嵌入式環境中運行的實現,因爲大多數Armadillo代碼在編譯期間由於其基於模板的設計方法而「蒸發」。
  • 儘管如此,其主要設計目標之一就是易於使用 - 該API在風格上與Matlab語法有特別相似(請參閱網站上的比較表)。

此外,儘管Armadillo可以獨立工作,但您可能需要考慮將其與LAPACK(和BLAS)實現結合使用以提高性能。一個好的選擇是例如OpenBLAS(或ATLAS)。檢查Armadillo's FAQ,它涵蓋了一些重要的話題。

在Google上的快速搜索挖起this presentation顯示Armadillo已被嵌入式系統使用。