Who am I

我的照片
Hefei, Anhui, China
Research Fields: Satellite Geodesy

2013年3月25日星期一

ubuntu下安装Lapack

1. 关于Lapack和Blas
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> 几个常用的函数名
  • 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函数来实现需要的功能。

2013年3月16日星期六

imagesc函数 NaN值颜色设定

imagesc函数主要是用来显示图片,其作用与pcolor类似,两者之间的比较见另一篇帖子。

这里主要介绍利用imagesc函数绘图时,矩阵值为NaN的通常用blue色来表示。如图1所示:
图1. NaN值对应为blue

如果想要将NaN值对应的颜色用白色表示,可以用如下语句:
h=imagesc(C);
set(h,'alphadata',~isnan(C));
所得新的图片如图2:
图2: NaN对应white





matlab图形边框不完整

在用matlab绘图时,有时会出现图形的边框缺少一边或两边,如图所示:
图1:图形边框不完整
解决此问题的方法如下:
方法一:将图片保存成jpg, png等格式时,边框可能会自动出现(不是确定管用的方法);
方法二:设置图形的“渲染”属性,如:h=figure; set(h,'Renderer','opengl')
方法三:开启opengl software,即添加语句:opengl software

关于matlab函数opengl的用法,可以查看说明。

利用上述方法后,得到的图片如下:
图2 完整的图形边框