C语言矩阵运算库大起底

来源:互联网 发布:淘宝电商差评怎么回复 编辑:程序博客网 时间:2024/04/30 21:06

GSL

GNU Scientific Library自带的矩阵运算,据说速度一般。

Blitz++

Blitz++ 与 MTL 都是基于 C++ template 高效数值计算程序库,不过他们专注于不同的方向。
Blitz++ 提供了一个 N 维( 1—10 )的 Array 类 , 这个 Array 类以 reference counting 技术实现,支持任意的存储序 (row-major 的 C-style 数组, column-major 的 Fortran-style 数组 ) ,数组的切割 (slicing), 子数组的提取 (subarray), 灵活的 Array 相关表达式处理。另外提供了可以产生不同分布的随机数 (F,Beta,Chi-Square ,正态,均匀分布等 ) 的类也是很有特色的。
MTL 专注于线性代数相关的计算任务,如各种形式矩阵的生成 ( 对角,共轭,稀疏,对称等 ) ,相关的计算,变换,以及与一维向量的运算。
两个程序库对于从 Matlab 导入导出数据都有不错的支持。

MTL4

类似Eigen和Armadillo,有开源版本。

Eigen

http://eigen.tuxfamily.org/dox/
Eigen[1] 目前最新的版本是3.2.5,除了C++标准库以外,不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试,并自动安装。如果使用Eigen库,只需包特定模块的的头文件即可。最新版本为Eigen 3.3。
使用类似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等解稀疏矩阵的功能。同时提供SPQR、UmfPack等外部稀疏矩阵库的接口。
•支持常用几何运算,包括旋转矩阵、四元数、矩阵变换、AngleAxis(欧拉角与Rodrigues变换)等等。
•更新活跃,用户众多(Google、WilliowGarage也在用),使用Eigen的比较著名的开源项目有ROS(机器人操作系统)、PCL(点云处理库)、Google Ceres(优化算法)。OpenCV自带到Eigen的接口。

Armadillo

矩阵运算速度跟matlab一个量级
目前使用比较广的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等库进行加速,因此还是不错的

Lapack (Linear Algebra PACKage)

http://www.netlib.org/lapack/
LAPACK,其名为Linear Algebra PACKage的缩写,是一以Fortran编程语言写就,用于数值计算的函式集。 LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题

Pardiso

http://www.pardiso-project.org/
The package PARDISO is a thread-safe, high-performance, robust, memory efficient and easy to use software for solving large sparse symmetric and unsymmetric linear systems of equations on shared-memory and distributed-memory multiprocessors.

Openblas

是一个高性能多核 BLAS 库,是 GotoBLAS2 1.13 BSD 版本的衍生版。OpenBLAS 的编译依赖系统环境,并且没有原生单线程版本,在实验这哦那个,通过设置 OMP_NUM_THREADS=1 来模拟单线程版本,可能会带来一点点的性能下降。

Intel mkl

https://software.intel.com/en-us/intel-mkl
Fastest and most used math library for Intel and compatible processors**
• Features highly optimized, threaded and vectorized functions to maximize performance on each processor family
• Utilizes de facto standard C and Fortran APIs for compatibility with BLAS, LAPACK and FFTW functions from other math libraries
• Available with both free community-supported and paid support licenses

来自 https://software.intel.com/en-us/intel-mkl

Trilinos

和PETSc同是美国能源部ODE2000支持开发的20多个ACTS工具箱之一,用于大规模计算。

Blas(Basic Linear Algebra Subprograms)
http://www.netlib.org/blas/

参考意见:
○ 在windows上Eigen的使用或许比Armadillo方便些
○ Intel mkl 强大,速度快
○ http://nghiaho.com/?p=954 (对比测试)
○ http://www.leexiang.com/the-performance-of-matrix-multiplication-among-openblas-intel-mkl-and-eigen (对比测试)
○ http://www.oschina.net/project/tag/239/Mathematics-computin?sort=view&lang=21&os=0 (其他软件合集)

0 0
原创粉丝点击