C++优秀的矩阵库
做圖像怎么能離開矩陣呢!
Armadillo:C++下的Matlab替代品
地址:http://arma.sourceforge.net/
許可證:MPL 2.0
目前使用比較廣的C++矩陣運(yùn)算庫(kù)之一,是在C++下使用Matlab方式操作矩陣很好的選擇,許多Matlab的矩陣操作函數(shù)都可以找到對(duì)應(yīng),這 對(duì)習(xí)慣了Matlab的人來(lái)說(shuō)實(shí)在是非常方便,另外如果要將Matlab下做研究的代碼改寫成C++,使用Armadillo也會(huì)很方便,這里有一個(gè)簡(jiǎn)易的Matlab到Armadillo的語(yǔ)法轉(zhuǎn)換。下面列了一些Armadillo的特性:
- 支持整數(shù),浮點(diǎn)數(shù),和復(fù)數(shù)矩陣。
- 支持矩陣逐元素操作,包括abs · conj · conv_to · eps · imag/real · misc functions (exp, log, pow, sqrt, round, sign, ...) · trigonometric functions (cos, sin, ...)等等。
- 支持矩陣分塊操作。
- 支持對(duì)整體矩陣的操作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等函數(shù)。
- 除了自帶的矩陣基本運(yùn)算之外,可自動(dòng)檢測(cè)是否安裝有BLAS,或更快的?OpenBLAS, Intel?MKL, AMD?ACML,并使用他們替代自帶基本運(yùn)算實(shí)現(xiàn)。
- 提供接口使用LAPACK進(jìn)行矩陣分解運(yùn)算,svd?· qr?· lu?· fft等等。
- 提供了稀疏矩陣類,支持常用操作,但暫時(shí)沒(méi)有矩陣分解的實(shí)現(xiàn)。
- 更新比較活躍,有一些計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)、物理方面的開源項(xiàng)目在使用,比如MLPACK?(Machine Learning Library)。
總體來(lái)講很好用的矩陣庫(kù),速度上因?yàn)榭梢允褂肙penBLAS等庫(kù)進(jìn)行加速,因此還是不錯(cuò)的。網(wǎng)上可以找到一個(gè)叫?Nghia Ho的人寫的關(guān)于和eigen及opencv的速度比較做參考,速度略優(yōu)。不過(guò)也由于依賴LAPACK等庫(kù)完成矩陣分解計(jì)算,在windows上運(yùn)行可能會(huì)比較痛苦。
Eigen3:強(qiáng)大且只需頭文件
地址:http://eigen.tuxfamily.org/
許可證:主要為MPL 2.0,部分有來(lái)自第三方的代碼為L(zhǎng)GPL
非常強(qiáng)大的矩陣運(yùn)算庫(kù),我一直在用,大家用了都說(shuō)好。使用類似Matlab的方式操作矩陣,可以在這里查看官方的與Maltab的對(duì)應(yīng)關(guān)系,個(gè)人感覺(jué)單純講和Matlab的對(duì)應(yīng)的話,可能不如Armadillo對(duì)應(yīng)的好,但功能絕對(duì)強(qiáng)大。Eigen包含了絕大部分你能用到的矩陣算法,同時(shí)提供許多第三方的接口。Eigen一個(gè)重要特點(diǎn)是沒(méi)有什么依賴的庫(kù),本身僅有許多頭文件組成,因此非常輕量而易于跨平臺(tái)。你要做的就是把用到的頭文件和你的代碼放在一起就可以了。Eigen的一些特性:
- 支持整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù),使用模板編程,可以為特殊的數(shù)據(jù)結(jié)構(gòu)提供矩陣操作。比如在用ceres-solver進(jìn)行做優(yōu)化問(wèn)題(比如bundle adjustment)的時(shí)候,有時(shí)候需要用模板編程寫一個(gè)目標(biāo)函數(shù),ceres可以將模板自動(dòng)替換為內(nèi)部的一個(gè)可以自動(dòng)求微分的特殊的double類型。而如果要在這個(gè)模板函數(shù)中進(jìn)行矩陣計(jì)算,使用Eigen就會(huì)非常方便。
- 支持逐元素、分塊、和整體的矩陣操作。
- 內(nèi)含大量矩陣分解算法包括LU,LDLt,QR、SVD等等。
- 支持使用Intel?MKL加速
- 部分功能支持多線程
- 稀疏矩陣支持良好,到今年新出的Eigen3.2,已經(jīng)自帶了SparseLU、SparseQR、共軛梯度 (ConjugateGradient solver)、bi conjugate gradient stabilized solver等解稀疏矩陣的功能。同時(shí)提供SPQR、UmfPack等外部稀疏矩陣庫(kù)的接口。
- 支持常用幾何運(yùn)算,包括旋轉(zhuǎn)矩陣、四元數(shù)、矩陣變換、AngleAxis(歐拉角與Rodrigues變換)等等。
- 更新活躍,用戶眾多(Google、WilliowGarage也在用),使用Eigen的比較著名的開源項(xiàng)目有ROS(機(jī)器人操作系統(tǒng))、PCL(點(diǎn)云處理庫(kù))、Google?Ceres(優(yōu)化算法)。OpenCV自帶到Eigen的接口。
總體來(lái)講,如果經(jīng)常做一些比較復(fù)雜的矩陣計(jì)算的話,或者想要跨平臺(tái)的話,非常值得一用。
OpenCV:方便的計(jì)算機(jī)視覺(jué)計(jì)算庫(kù)
地址:http://opencv.org/
許可證:目前是BSD
OpenCV在計(jì)算機(jī)視覺(jué)領(lǐng)域名氣實(shí)在是太大了,而且最近幾年庫(kù)里的算法開始爆炸式的增長(zhǎng),最近貌似計(jì)劃推出OpenCV 3了(參見這里)。有人開始抱怨OpenCV現(xiàn)在內(nèi)容太雜了,不過(guò)這樣的好處就是從是研究開發(fā)的話,一個(gè)庫(kù)就可以得到大部分計(jì)算機(jī)視覺(jué)的流行算法,省去了很多麻煩。
OpenCV自帶的矩陣計(jì)算功能算不上是專業(yè)的矩陣計(jì)算庫(kù),但是如果你用C++寫機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺(jué)的程序,一定會(huì)經(jīng)常用到。OpenCV的矩陣 計(jì)算功能還算比較完善,雖然速度略差勁,但用在大多數(shù)的開發(fā)和研究領(lǐng)域也是足夠了。特別是OpenCV 2.2之后提供了類Matlab的矩陣C++接口,使得直接使用OpenCV進(jìn)行矩陣計(jì)算變得簡(jiǎn)單易用。列兩個(gè)比較值得一提的特點(diǎn):
- 大量計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)相關(guān)的矩陣操作,非常方便。比如PCA、LDA、三維空間投影等等。
- 自帶并行加速的矩陣計(jì)算功能。其中cv::gpu模塊提供了CUDA支持的GPU矩陣計(jì)算功能,cv::ocl模塊提供了OpenCL支持的并行矩陣計(jì)算功能。可以非常方便的進(jìn)行并行矩陣計(jì)算,不過(guò)不足的是這兩個(gè)模塊還暫時(shí)缺少矩陣分解的實(shí)現(xiàn)。我曾見過(guò)朋友在做深度學(xué)習(xí)的時(shí)候用cv::ocl模塊進(jìn)行大矩陣乘法,貌似效果還不錯(cuò)。
ViennaCL:并行矩陣計(jì)算
網(wǎng)址:http://viennacl.sourceforge.net/
許可證:MIT
作者Karl Rupp來(lái)自維也納大學(xué),開發(fā)了一套Vienna*系列的開源軟件,其中還包括ViennaMath(symbolic math符號(hào)計(jì)算)、ViennaFEM(有限元)等等。ViennaCL在后臺(tái)支持OpenCL、OpenMP和CUDA,可以方便地使用各種型號(hào)的CPU或GPU進(jìn)行并行計(jì)算。
- 目前矩陣類型支持float和double,1.4.2版尚不支持復(fù)數(shù)矩陣。
- 支持常用的矩陣運(yùn)算和分解。
- 接口很有好,并提供接口到uBLAS、Eigen、MTL 4等矩陣庫(kù)。
安裝使用有非常詳細(xì)的官方文檔。
PETSc:大規(guī)模并行科學(xué)計(jì)算
網(wǎng)站:http://www.mcs.anl.gov/petsc/
許可證:Copyright University of Chicago (GPL compatible)
PETSc(Portable, Extensible Toolkit for Scientific Computation)??是美國(guó)能源部ODE2000支持開發(fā)的20多個(gè)ACTS工具箱之一,由Argonne國(guó)家實(shí)驗(yàn)室開發(fā)的可移植可擴(kuò)展科學(xué)計(jì)算 工具箱,主要用于在分布式存儲(chǔ)環(huán)境高效求解偏微分方程組及相關(guān)問(wèn)題。PETSc所有消息傳遞通信均采用MPI標(biāo)準(zhǔn)實(shí)現(xiàn)。線性方程組求解器是PETSc的核 心組件之一,PETSc幾乎提供了所有求解線性方程組的高效求解器,既有串行求解也有并行求解,既有直接法求解也有迭代法求解。對(duì)于大規(guī)模線性方程組, PETSc提供了大量基于Krylov子空間方法和各種預(yù)條件子的成熟而有效的迭代方法,以及其他通用程序和用戶程序的接口。PETSc具有一般庫(kù)軟件所具備的高性能、可移植等優(yōu)點(diǎn),而且面向?qū)ο蠹夹g(shù)使得PETSc內(nèi)部功能部件的使用非常方便,接口簡(jiǎn)單而又適用面廣,可以縮短開發(fā)周期,減少工作量。[直接粘百度百科了]。
PETSc在網(wǎng)上可一找到很多英文資料,使用也比較廣泛。不過(guò)在學(xué)校實(shí)驗(yàn)室的一般的科學(xué)計(jì)算可能接觸的還比較少。推薦一個(gè)YouTube(可能要FQ)的五集PETSc簡(jiǎn)單入門《PRACE Video Tutorial - PETSc Tutorial》。
其他的矩陣計(jì)算庫(kù)和資料
在Stackexchange上有一個(gè)帖子《Recommendations for a usable, fast C++ matrix library?》里面搜羅了許多矩陣運(yùn)算庫(kù)。另外INRIA有人寫了一個(gè)文檔《Linear Algebra Libraries》,對(duì)常見的矩陣運(yùn)算庫(kù)進(jìn)行了總結(jié)。除了上面提到的幾個(gè)庫(kù)之外,下面還有一些比較常用或堅(jiān)持更新的矩陣庫(kù):
- uBLAS:Boost包中的BLAS庫(kù)接口,據(jù)說(shuō)速度一般。
- GSL:GNU Scientific Library自帶的矩陣運(yùn)算,據(jù)說(shuō)速度一般。
- MTL 4:Matrix Template Library?version 4,類似Eigen和Armadillo,有開源版本。
- Trilinos:和PETSc同是美國(guó)能源部ODE2000支持開發(fā)的20多個(gè)ACTS工具箱之一,用于大規(guī)模計(jì)算。
本文轉(zhuǎn)載自:cvnote
?
?
2014年04月09日?? 字號(hào)?小?中?大
最近在幾個(gè)地方都看到有人問(wèn)C++下用什么矩陣運(yùn)算庫(kù)比較好,順便做了個(gè)調(diào)查,做一些相關(guān)的推薦吧。主要針對(duì)稠密矩陣,有時(shí)間會(huì)再寫一個(gè)稀疏矩陣的推薦。
Armadillo:C++下的Matlab替代品
地址:http://arma.sourceforge.net/
許可證:MPL 2.0
目前使用比較廣的C++矩陣運(yùn)算庫(kù)之一,是在C++下使用Matlab方式操作矩陣很好的選擇,許多Matlab的矩陣操作函數(shù)都可以找到對(duì)應(yīng),這 對(duì)習(xí)慣了Matlab的人來(lái)說(shuō)實(shí)在是非常方便,另外如果要將Matlab下做研究的代碼改寫成C++,使用Armadillo也會(huì)很方便,這里有一個(gè)簡(jiǎn)易的Matlab到Armadillo的語(yǔ)法轉(zhuǎn)換。下面列了一些Armadillo的特性:
- 支持整數(shù),浮點(diǎn)數(shù),和復(fù)數(shù)矩陣。
- 支持矩陣逐元素操作,包括abs · conj · conv_to · eps · imag/real · misc functions (exp, log, pow, sqrt, round, sign, ...) · trigonometric functions (cos, sin, ...)等等。
- 支持矩陣分塊操作。
- 支持對(duì)整體矩陣的操作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等函數(shù)。
- 除了自帶的矩陣基本運(yùn)算之外,可自動(dòng)檢測(cè)是否安裝有BLAS,或更快的?OpenBLAS, Intel?MKL, AMD?ACML,并使用他們替代自帶基本運(yùn)算實(shí)現(xiàn)。
- 提供接口使用LAPACK進(jìn)行矩陣分解運(yùn)算,svd?· qr?· lu?· fft等等。
- 提供了稀疏矩陣類,支持常用操作,但暫時(shí)沒(méi)有矩陣分解的實(shí)現(xiàn)。
- 更新比較活躍,有一些計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)、物理方面的開源項(xiàng)目在使用,比如MLPACK?(Machine Learning Library)。
總體來(lái)講很好用的矩陣庫(kù),速度上因?yàn)榭梢允褂肙penBLAS等庫(kù)進(jìn)行加速,因此還是不錯(cuò)的。網(wǎng)上可以找到一個(gè)叫?Nghia Ho的人寫的關(guān)于和eigen及opencv的速度比較做參考,速度略優(yōu)。不過(guò)也由于依賴LAPACK等庫(kù)完成矩陣分解計(jì)算,在windows上運(yùn)行可能會(huì)比較痛苦。
Eigen3:強(qiáng)大且只需頭文件
地址:http://eigen.tuxfamily.org/
許可證:主要為MPL 2.0,部分有來(lái)自第三方的代碼為L(zhǎng)GPL
非常強(qiáng)大的矩陣運(yùn)算庫(kù),我一直在用,大家用了都說(shuō)好。使用類似Matlab的方式操作矩陣,可以在這里查看官方的與Maltab的對(duì)應(yīng)關(guān)系,個(gè)人感覺(jué)單純講和Matlab的對(duì)應(yīng)的話,可能不如Armadillo對(duì)應(yīng)的好,但功能絕對(duì)強(qiáng)大。Eigen包含了絕大部分你能用到的矩陣算法,同時(shí)提供許多第三方的接口。Eigen一個(gè)重要特點(diǎn)是沒(méi)有什么依賴的庫(kù),本身僅有許多頭文件組成,因此非常輕量而易于跨平臺(tái)。你要做的就是把用到的頭文件和你的代碼放在一起就可以了。Eigen的一些特性:
- 支持整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù),使用模板編程,可以為特殊的數(shù)據(jù)結(jié)構(gòu)提供矩陣操作。比如在用ceres-solver進(jìn)行做優(yōu)化問(wèn)題(比如bundle adjustment)的時(shí)候,有時(shí)候需要用模板編程寫一個(gè)目標(biāo)函數(shù),ceres可以將模板自動(dòng)替換為內(nèi)部的一個(gè)可以自動(dòng)求微分的特殊的double類型。而如果要在這個(gè)模板函數(shù)中進(jìn)行矩陣計(jì)算,使用Eigen就會(huì)非常方便。
- 支持逐元素、分塊、和整體的矩陣操作。
- 內(nèi)含大量矩陣分解算法包括LU,LDLt,QR、SVD等等。
- 支持使用Intel?MKL加速
- 部分功能支持多線程
- 稀疏矩陣支持良好,到今年新出的Eigen3.2,已經(jīng)自帶了SparseLU、SparseQR、共軛梯度 (ConjugateGradient solver)、bi conjugate gradient stabilized solver等解稀疏矩陣的功能。同時(shí)提供SPQR、UmfPack等外部稀疏矩陣庫(kù)的接口。
- 支持常用幾何運(yùn)算,包括旋轉(zhuǎn)矩陣、四元數(shù)、矩陣變換、AngleAxis(歐拉角與Rodrigues變換)等等。
- 更新活躍,用戶眾多(Google、WilliowGarage也在用),使用Eigen的比較著名的開源項(xiàng)目有ROS(機(jī)器人操作系統(tǒng))、PCL(點(diǎn)云處理庫(kù))、Google?Ceres(優(yōu)化算法)。OpenCV自帶到Eigen的接口。
總體來(lái)講,如果經(jīng)常做一些比較復(fù)雜的矩陣計(jì)算的話,或者想要跨平臺(tái)的話,非常值得一用。
OpenCV:方便的計(jì)算機(jī)視覺(jué)計(jì)算庫(kù)
地址:http://opencv.org/
許可證:目前是BSD
OpenCV在計(jì)算機(jī)視覺(jué)領(lǐng)域名氣實(shí)在是太大了,而且最近幾年庫(kù)里的算法開始爆炸式的增長(zhǎng),最近貌似計(jì)劃推出OpenCV 3了(參見這里)。有人開始抱怨OpenCV現(xiàn)在內(nèi)容太雜了,不過(guò)這樣的好處就是從是研究開發(fā)的話,一個(gè)庫(kù)就可以得到大部分計(jì)算機(jī)視覺(jué)的流行算法,省去了很多麻煩。
OpenCV自帶的矩陣計(jì)算功能算不上是專業(yè)的矩陣計(jì)算庫(kù),但是如果你用C++寫機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺(jué)的程序,一定會(huì)經(jīng)常用到。OpenCV的矩陣 計(jì)算功能還算比較完善,雖然速度略差勁,但用在大多數(shù)的開發(fā)和研究領(lǐng)域也是足夠了。特別是OpenCV 2.2之后提供了類Matlab的矩陣C++接口,使得直接使用OpenCV進(jìn)行矩陣計(jì)算變得簡(jiǎn)單易用。列兩個(gè)比較值得一提的特點(diǎn):
- 大量計(jì)算機(jī)視覺(jué)、機(jī)器學(xué)習(xí)相關(guān)的矩陣操作,非常方便。比如PCA、LDA、三維空間投影等等。
- 自帶并行加速的矩陣計(jì)算功能。其中cv::gpu模塊提供了CUDA支持的GPU矩陣計(jì)算功能,cv::ocl模塊提供了OpenCL支持的并行矩陣計(jì)算功能。可以非常方便的進(jìn)行并行矩陣計(jì)算,不過(guò)不足的是這兩個(gè)模塊還暫時(shí)缺少矩陣分解的實(shí)現(xiàn)。我曾見過(guò)朋友在做深度學(xué)習(xí)的時(shí)候用cv::ocl模塊進(jìn)行大矩陣乘法,貌似效果還不錯(cuò)。
ViennaCL:并行矩陣計(jì)算
網(wǎng)址:http://viennacl.sourceforge.net/
許可證:MIT
作者Karl Rupp來(lái)自維也納大學(xué),開發(fā)了一套Vienna*系列的開源軟件,其中還包括ViennaMath(symbolic math符號(hào)計(jì)算)、ViennaFEM(有限元)等等。ViennaCL在后臺(tái)支持OpenCL、OpenMP和CUDA,可以方便地使用各種型號(hào)的CPU或GPU進(jìn)行并行計(jì)算。
- 目前矩陣類型支持float和double,1.4.2版尚不支持復(fù)數(shù)矩陣。
- 支持常用的矩陣運(yùn)算和分解。
- 接口很有好,并提供接口到uBLAS、Eigen、MTL 4等矩陣庫(kù)。
安裝使用有非常詳細(xì)的官方文檔。
PETSc:大規(guī)模并行科學(xué)計(jì)算
網(wǎng)站:http://www.mcs.anl.gov/petsc/
許可證:Copyright University of Chicago (GPL compatible)
PETSc(Portable, Extensible Toolkit for Scientific Computation)??是美國(guó)能源部ODE2000支持開發(fā)的20多個(gè)ACTS工具箱之一,由Argonne國(guó)家實(shí)驗(yàn)室開發(fā)的可移植可擴(kuò)展科學(xué)計(jì)算 工具箱,主要用于在分布式存儲(chǔ)環(huán)境高效求解偏微分方程組及相關(guān)問(wèn)題。PETSc所有消息傳遞通信均采用MPI標(biāo)準(zhǔn)實(shí)現(xiàn)。線性方程組求解器是PETSc的核 心組件之一,PETSc幾乎提供了所有求解線性方程組的高效求解器,既有串行求解也有并行求解,既有直接法求解也有迭代法求解。對(duì)于大規(guī)模線性方程組, PETSc提供了大量基于Krylov子空間方法和各種預(yù)條件子的成熟而有效的迭代方法,以及其他通用程序和用戶程序的接口。PETSc具有一般庫(kù)軟件所具備的高性能、可移植等優(yōu)點(diǎn),而且面向?qū)ο蠹夹g(shù)使得PETSc內(nèi)部功能部件的使用非常方便,接口簡(jiǎn)單而又適用面廣,可以縮短開發(fā)周期,減少工作量。[直接粘百度百科了]。
PETSc在網(wǎng)上可一找到很多英文資料,使用也比較廣泛。不過(guò)在學(xué)校實(shí)驗(yàn)室的一般的科學(xué)計(jì)算可能接觸的還比較少。推薦一個(gè)YouTube(可能要FQ)的五集PETSc簡(jiǎn)單入門《PRACE Video Tutorial - PETSc Tutorial》。
其他的矩陣計(jì)算庫(kù)和資料
在Stackexchange上有一個(gè)帖子《Recommendations for a usable, fast C++ matrix library?》里面搜羅了許多矩陣運(yùn)算庫(kù)。另外INRIA有人寫了一個(gè)文檔《Linear Algebra Libraries》,對(duì)常見的矩陣運(yùn)算庫(kù)進(jìn)行了總結(jié)。除了上面提到的幾個(gè)庫(kù)之外,下面還有一些比較常用或堅(jiān)持更新的矩陣庫(kù):
- uBLAS:Boost包中的BLAS庫(kù)接口,據(jù)說(shuō)速度一般。
- GSL:GNU Scientific Library自帶的矩陣運(yùn)算,據(jù)說(shuō)速度一般。
- MTL 4:Matrix Template Library?version 4,類似Eigen和Armadillo,有開源版本。
- Trilinos:和PETSc同是美國(guó)能源部ODE2000支持開發(fā)的20多個(gè)ACTS工具箱之一,用于大規(guī)模計(jì)算。
總結(jié)
- 上一篇: VAE【变分自编码器】
- 下一篇: linux distribution t