Lapack (Linear Algebra Package)是一个以Fortran90编写,用于数值计算的函数集。例如,用于解线性方程组、计算特征向量、计算矩阵QR分解、奇异值分解等问题。
Blas(Basic Linear Algebra Subprograms),基础线性代数程序集,用于基本的矢量和矩阵运算。最初发布于1979年,并用于建立更大的数值程序包(Lapack)。一级Blas负责矢量-矢量运算,二级Blas负责矢量-矩阵运算,而三级Blas负责矩阵-矩阵运算。由于Blas的高效,在高质量线性代数软件中常常使用它。
2. Lapack安装
1> 下载Lapack
http://www.netlib.org/lapack/ 最新版本3.4.2
2> 解压
tar -zxf lapack-3.4.2.tgz
3> 编辑make.inc文件
进入解压后的文件夹,会有一个make.inc.example文件,将该文件重命名为make.inc文件;并查看该文件,默认编译器为gfortran,根据需要修改对应的参数。在ubuntu下,采用gfortran作为编译器,一般不许要修改该文件。
4> 编辑Makefile文件
将下列语句(设定生成的库,默认不包含blaslib)
lib: lapacklib tmglib
# lib: blaslib variants lapacklib tmglib
改成:
# lib: lapacklib tmglib
lib: blaslib variants lapacklib tmglib
生成的库中包含了blaslib。
5> make
安装并测试Lapack。
6> 将生成的静态库(.a)移到/usr/lib文件夹下
生成的静态库包含libblas.a liblapack.a libtmglib等三个库。
sudo mv *.a /usr/lib
3. Lapack使用
在编译程序时,语句如下(其中test.f90文件中包含了lapack里的routines):
gfortran -o test test.f90 -llapack -lblas
4. Lapack概述
1> Levels of Routines
Lapack的程序分三个层次,分别是driver, computational和auxiliary。driver routines解决一个具体的问题,如求解线性方程组或计算一个实对称阵的特征值。如果用户的问题刚好可以用该层次的程序解决,推荐用该层次的程序。这类程序通常调用几个computational routines或者一些其他的子程序。computational routines解决单独的一个计算任务,如LU分解。用户可以根据自身的需求调用该类程序。auxiliary routines这里不做阐述。一般用户一般调用driver和computational routines较多。
2> 数据类型和函数命名规则
Lapack函数命名格式为XYYZZZ,其中:
X表示数据类型:
- S 表示单精度;
- D 表示双精度;
- C 表示复数;
- Z 表示双精度复数;
YY表示矩阵类型:
- DI 表示对角阵;
- GE 表示一般矩阵;
- GT 表示一般三角阵;
- OR 表示正交阵;
- PO 表示正定阵;
- TR表示三角阵;
ZZZ表示具体的计算问题:
- SV或SVX(求解线性方程组),前者是simple版,后者是expert版(输出一些中间结果,耗费内存更多)
- QR(QR分解)
- LU (LU分解)
- ...
3> 几个常用的函数名
更多内容参见Lapack User's Guide, http://www.netlib.org/lapack/lug/
- dgesv 求解线性方程组AX=B
- dgels 线性方程组AX=B的LS解
- xyyTRF 将矩阵yy进行三角分解(根据矩阵yy的类型,选择不同的分解方法,如GE矩阵用LU分解,对称正定矩阵采用Cholesky分解)
- xyyTRS 基于xyyTRF分解的结果求解AX=B
- xyyTRI 基于xyyTRF分解的结果求解$A^{-1}$
因此,dgesv等价与dgetrf和dgetrs的组合,dposv等价与dpotrf和dpotrs的组合,dgels等价与dgeqrf和dtrtrs的组合。
更多内容参见Lapack User's Guide, http://www.netlib.org/lapack/lug/
5. 不错的资源
补充:
Lapack是用fortran写的,Lapacke是它的C语言接口,先安装Lapack,然后安装Lapacke,那么在程序中可以直接调用C函数来实现需要的功能。