数值计算库与科学计算库

##BLAS 接口
BLAS, LAPACK, ATLAS 这些数值计算库的名字很类似,他们之间有什么关系呢?BLAS是一组线性代数运算接口,目前是事实上的标准,很多数值计算/科学计算都实现了这套接口。

BLAS定义了那些函数呢?可以查看官方文档

LAPACK是BLAS的第一个实现,是最老牌的数值计算库,用FORTRAN 77语言写的。LAPACK实现了BLAS接口,并扩充了一些功能。很多数值计算库/科学计算库底层调用了LAPACK。

很多硬件厂商都实现BLAS接口,例如Intel MKL(Math Kernel Library), AMCL(AMD Math Core Library)等。很多开源库也支持,例如ATLAS。

还有非常多的库实现了BLAS接口,见Wikipedia BLAS 的Implementations小节。

下面介绍一些各种语言常用的数值计算/科学计算库。

##C/C++
首先是Intel 的MKL 和 AMD 的AMCL,性能一流,不过是商业软件,价格昂贵。

GSL - GNU Scientific Library,GNU实现的库,质量很高,不过是用纯C写的,用起来比较繁琐。

Armadillo,最新版 2013-02-20 Version 3.6.3

IT++,最后版本是4.2,2010-09-21。

##Java
这个页面JavaNumerics page专门收集了关于Java数值计算的库。

java-matrix-benchmark这个开源项目,比较了各类Java线性代数库的性能。

Java的数值计算库主要分为两类:Pure Java和Natie Wrapper。Pure Java是指用纯Java编写的,Native Wrapper是指该库底层调用了C++或Fortan编写的第三方库,上面封装了一层,提供了更有好的接口。

Pure Java的有:Colt, Commons Math, EJML, JAMA, Trove

Native Wrapper有:jblasMatrix Toolkit Java

下面介绍一些影响力较大的java数值计算/科学计算库。

Commons Math, 最新版本是3.1.1,2013年1月9号发布。这个库提供一些基本的数学运算,没有high-level的东西,例如矩阵,向量等,用起来会比较繁琐。

JAMA, 最新版是Version 1.0.3 (November 9, 2012)。

Colt,已经不更新了,最后版本是1.2.0,2004年9月发布的。

Apache Mahout使用了Colt作为high performance collections,见官方这个页面,说“The implementation of Mahout Collections is derived from Cern Colt”,以及quora 这个帖子What are the best resources for distributed numerical analysis/matrix algorithms

##Python
目前最有影响力的莫过于NumPySciPy。Amazon.com上可以搜到专门讲它们的书。

SciPy依赖NumPy,主要是在数值计算方面调用了NumPy。

##Ruby
SciRuby, 是SciPy和NumPy的克隆,目前还在开发中。

##R
R刚开始时是统计学家开发的语言,专门用于数理统计,现在功能不断增强,内置了很多数值计算和科学计算的功能。R在数据分析领域比较火。

##Scala
目前用google搜索 “scala numerical computing”,能找得到的就是ScalaLab了。

##Matlab
最后,别忘了Matlab是支持多语言调用的。

可以用Matlab生成DLL,给C/C++语言调用。其实,凡是能调用DLL的语言,都可以使用这个DLL,例如Python, Ruby等。

可以用Matlab JavaBuilder将m文件转换为jar文件,然后在java代码中就可以调用了。

##如何选择
本文的重点在于选择一个高性能,同时又比较易用的库,即被让我们调用,用来写程序的库,不是一个集成环境或REPL环境。因此R和Matlab不在讨论范围内。R和Matlab用来做原型或前期Data Exploration比较适合。

选择一个工具(语言,框架,库等),要看其是否成熟。我个人的一些判断指标,主要有

  1. 有没有大厂商的支持(作为vendor之类的);
  2. amazon.com上能否搜到书。

从厂商的支持来看,几个主要的大厂商如 Intel,AMD和Apple都开发了自己的数学库。Python则有很成熟的NumPy,在Amazon上能搜到书,例如“SciPy and NumPy”, “NumPy Cookbook”。 因此,目前来看,C++和Python是比较成熟的方案。

##参考资料
Wikipedia BLAS
Wikipedia LAPACK
用 BLAS/LAPACK 编写矩阵运算程序
BLAS, LAPACK, ATLAS
BLAS 和 LAPACK ,以及其他常用数值计算库
Any numerical computing environment on Java platform
C++ Libraries for Scientific Computing
Scientific Library Options for C or C++
Why is Python used for high-performance/scientific computing (but Ruby isn’t)?