1. 程式人生 > >C++矩陣運算庫推薦

C++矩陣運算庫推薦

Armadillo:C++下的Matlab替代品 Eigen3:強大且只需標頭檔案 OpenCV:方便的計算機視覺計算庫 ViennaCL:並行矩陣計算 PETSc:大規模並行科學計算 其他的矩陣計算庫和資料

最近在幾個地方都看到有人問C++下用什麼矩陣運算庫比較好,順便做了個調查,做一些相關的推薦吧。主要針對稠密矩陣,有時間會再寫一個稀疏矩陣的推薦。歡迎關注我的獨立部落格:http://cvnote.info/。另外新開了個新浪微博@cvnote求關注!啊!!! Armadillo:C++下的Matlab替代品

許可證:MPL 2.0

目前使用比較廣的C++矩陣運算庫之一,是在C++下使用Matlab方式操作矩陣很好的選擇,許多Matlab的矩陣操作函式都可以找到對應,這對習慣了Matlab的人來說實在是非常方便,另外如果要將Matlab下做研究的程式碼改寫成C++,使用Armadillo也會很方便,這裡有一個簡易的Matlab到Armadillo的語法轉換。下面列了一些Armadillo的特性:

  1. 支援整數,浮點數,和複數矩陣。
  2. 支援矩陣逐元素操作,包括abs · conj · conv_to · eps · imag/real · misc functions (exp, log, pow, sqrt, round, sign, …) · trigonometric functions (cos, sin, …)等等。
  3. 支援矩陣分塊操作。
  4. 支援對整體矩陣的操作diagvec · min/max · prod · sum · statistics (mean, stddev, …) · accu · as_scalar · det · dot/cdot/norm_dot · log_det · norm · rank · trace等等。
  5. Matlab使用者,你甚至可以找到你熟悉的hist · histc · unique · cumsum · sort_index · find · repmat · linspace等函式。
  6. 除了自帶的矩陣基本運算之外,可自動檢測是否安裝有BLAS,或更快的 OpenBLAS, Intel MKL, AMD ACML,並使用他們替代自帶基本運算實現。
  7. 提供介面使用LAPACK進行矩陣分解運算,svd · qr · lu · fft等等。
  8. 提供了稀疏矩陣類,支援常用操作,但暫時沒有矩陣分解的實現。
  9. 更新比較活躍,有一些計算機視覺、機器學習、物理方面的開源專案在使用,比如MLPACK (Machine Learning Library)。

總體來講很好用的矩陣庫,速度上因為可以使用OpenBLAS等庫進行加速,因此還是不錯的。網上可以找到一個叫 Nghia Ho的人寫的關於和eigen及opencv的速度比較做參考,速度略優。不過也由於依賴LAPACK等庫完成矩陣分解計算,在windows上執行可能會比較痛苦。 Eigen3:強大且只需標頭檔案

許可證:主要為MPL 2.0,部分有來自第三方的程式碼為LGPL

非常強大的矩陣運算庫,我一直在用,大家用了都說好。使用類似Matlab的方式操作矩陣,可以在這裡檢視官方的與Maltab的對應關係,個人感覺單純講和Matlab的對應的話,可能不如Armadillo對應的好,但功能絕對強大。Eigen包含了絕大部分你能用到的矩陣演算法,同時提供許多第三方的介面。Eigen一個重要特點是沒有什麼依賴的庫,本身僅有許多標頭檔案組成,因此非常輕量而易於跨平臺。你要做的就是把用到的標頭檔案和你的程式碼放在一起就可以了。Eigen的一些特性:

  1. 支援整數、浮點數、複數,使用模板程式設計,可以為特殊的資料結構提供矩陣操作。比如在用ceres-solver進行做優化問題(比如bundle adjustment)的時候,有時候需要用模板程式設計寫一個目標函式,ceres可以將模板自動替換為內部的一個可以自動求微分的特殊的double型別。而如果要在這個模板函式中進行矩陣計算,使用Eigen就會非常方便。
  2. 支援逐元素、分塊、和整體的矩陣操作。
  3. 內含大量矩陣分解演算法包括LU,LDLt,QR、SVD等等。
  4. 支援使用Intel MKL加速
  5. 部分功能支援多執行緒
  6. 稀疏矩陣支援良好,到今年新出的Eigen3.2,已經自帶了SparseLU、SparseQR、共軛梯度(ConjugateGradient solver)、bi conjugate gradient stabilized solver等解稀疏矩陣的功能。同時提供SPQR、UmfPack等外部稀疏矩陣庫的介面。
  7. 支援常用幾何運算,包括旋轉矩陣、四元數、矩陣變換、AngleAxis(尤拉角與Rodrigues變換)等等。
  8. 更新活躍,使用者眾多(Google、WilliowGarage也在用),使用Eigen的比較著名的開源專案有ROS(機器人作業系統)、PCL(點雲處理庫)、Google Ceres(優化演算法)。OpenCV自帶到Eigen的介面。

總體來講,如果經常做一些比較複雜的矩陣計算的話,或者想要跨平臺的話,非常值得一用。 OpenCV:方便的計算機視覺計算庫

許可證:目前是BSD

OpenCV在計算機視覺領域名氣實在是太大了,而且最近幾年庫裡的演算法開始爆炸式的增長,最近貌似計劃推出OpenCV 3了(參見這裡)。有人開始抱怨OpenCV現在內容太雜了,不過這樣的好處就是從是研究開發的話,一個庫就可以得到大部分計算機視覺的流行演算法,省去了很多麻煩。

OpenCV自帶的矩陣計算功能算不上是專業的矩陣計算庫,但是如果你用C++寫機器學習、計算機視覺的程式,一定會經常用到。OpenCV的矩陣計算功能還算比較完善,雖然速度略差勁,但用在大多數的開發和研究領域也是足夠了。特別是OpenCV 2.2之後提供了類Matlab的矩陣C++介面,使得直接使用OpenCV進行矩陣計算變得簡單易用。列兩個比較值得一提的特點:

  1. 大量計算機視覺、機器學習相關的矩陣操作,非常方便。比如PCA、LDA、三維空間投影等等。
  2. 自帶並行加速的矩陣計算功能。其中cv::gpu模組提供了CUDA支援的GPU矩陣計算功能,cv::ocl模組提供了OpenCL支援的並行矩陣計算功能。可以非常方便的進行並行矩陣計算,不過不足的是這兩個模組還暫時缺少矩陣分解的實現。我曾見過朋友在做深度學習的時候用cv::ocl模組進行大矩陣乘法,貌似效果還不錯。

ViennaCL:並行矩陣計算

許可證:MIT

作者Karl Rupp來自維也納大學,開發了一套Vienna*系列的開源軟體,其中還包括ViennaMath(symbolic math符號計算)、ViennaFEM(有限元)等等。ViennaCL在後臺支援OpenCL、OpenMP和CUDA,可以方便地使用各種型號的CPU或GPU進行平行計算。

  1. 目前矩陣型別支援float和double,1.4.2版尚不支援複數矩陣。
  2. 支援常用的矩陣運算和分解。
  3. 介面很有好,並提供介面到uBLAS、Eigen、MTL 4等矩陣庫。

安裝使用有非常詳細的官方文件。 PETSc:大規模並行科學計算

許可證:Copyright University of Chicago (GPL compatible)

PETSc(Portable, Extensible Toolkit for Scientific Computation) 是美國能源部ODE2000支援開發的20多個ACTS工具箱之一,由Argonne國家實驗室開發的可移植可擴充套件科學計算工具箱,主要用於在分散式儲存環境高效求解偏微分方程組及相關問題。PETSc所有訊息傳遞通訊均採用MPI標準實現。線性方程組求解器是PETSc的核心元件之一,PETSc幾乎提供了所有求解線性方程組的高效求解器,既有序列求解也有並行求解,既有直接法求解也有迭代法求解。對於大規模線性方程組, PETSc提供了大量基於Krylov子空間方法和各種預條件子的成熟而有效的迭代方法,以及其他通用程式和使用者程式的介面。PETSc具有一般庫軟體所具備的高效能、可移植等優點,而且面向物件技術使得PETSc內部功能部件的使用非常方便,介面簡單而又適用面廣,可以縮短開發週期,減少工作量。[直接粘百度百科了]。

PETSc在網上可一找到很多英文資料,使用也比較廣泛。不過在學校實驗室的一般的科學計算可能接觸的還比較少。推薦一個YouTube(可能要翻牆)的五集PETSc簡單入門《PRACE Video Tutorial – PETSc Tutorial》。 其他的矩陣計算庫和資料

在Stackexchange上有一個帖子《Recommendations for a usable, fast C++ matrix library?》裡面蒐羅了許多矩陣運算庫。另外INRIA有人寫了一個文件《Linear Algebra Libraries》,對常見的矩陣運算庫進行了總結。除了上面提到的幾個庫之外,下面還有一些比較常用或堅持更新的矩陣庫:

  1. uBLAS:Boost包中的BLAS庫介面,據說速度一般。
  2. GSL:GNU Scientific Library自帶的矩陣運算,據說速度一般。
  3. MTL 4:Matrix Template Library version 4,類似Eigen和Armadillo,有開源版本。
  4. Trilinos:和PETSc同是美國能源部ODE2000支援開發的20多個ACTS工具箱之一,用於大規模計算。