C++矩陣庫推薦

最近在幾個地方都看到有人問C++下用什麼矩陣運算庫比較好,順便做了個調查,做一些相關的推薦吧。主要針對稠密矩陣,有時間會再寫一個稀疏矩陣的推薦。

Armadillo:C++下的Matlab替代品

armadillo

地址:http://arma.sourceforge.net/

許可證:MPL 2.0

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

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

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

Eigen3:強大且只需頭文件

地址:http://eigen.tuxfamily.org/

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

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

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

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

OpenCV:方便的計算機視覺計算庫

地址:http://opencv.org/

許可證:目前是BSD

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

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

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

ViennaCL:並行矩陣計算

ViennaCL Logo

網址:http://viennacl.sourceforge.net/

許可證:MIT

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

  • 目前矩陣類型支持float和double,1.4.2版尚不支持複數矩陣。
  • 支持常用的矩陣運算和分解。
  • 接口很有好,並提供接口到uBLAS、Eigen、MTL 4等矩陣庫。

安裝使用有非常詳細的官方文檔

PETSc:大規模並行科學計算

網站:http://www.mcs.anl.gov/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》,對常見的矩陣運算庫進行了總結。除了上面提到的幾個庫之外,下面還有一些比較常用或堅持更新的矩陣庫:

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

來自http://cvnote.info

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章