《程序员的数学3:线性代数》阅读总结

《程序员的数学3:线性代数》阅读总结

大学时代,感觉线性代数是一门比概率统计更没有用的数学课,直到最近逐渐接触图形编程或机器学习等领域才发现线性代数的应用无处不在,特别是在图形领域,全部是线性代数的运算。
这本书主要还是大学《线性代数》的复习,内容包括向量、矩阵、行列式、秩、逆矩阵、线性方程、LU分解、特征值、对角化、Jordan标准型、特征值算法等。回忆一下早已遗忘的内容,当然也会有重新的理解。这些知识点类的书,看完之后依然是没有什么特别的总结,但是阅读过程中发现的一篇文章《程序观点下的线性代数》非常不错,以程序员的角度对线性代数有一个全新的思考,其中“从应用的角度看,线性代数是一种人为设计的领域特定语言(DSL),它建立了一套模型并通过符号系统完成语法和语义的映射”的观点,非常认同的。特别是近期频繁接触numpy,API的风格和线性代数的操作很接近。关于线性代数的思考,这篇文章介绍得很有特点,短期自己的理解有限,受到这篇文章的影响会比较大,也就不重复这些观点了。
但是可以介绍一下这段时间对线性代数基本库使用上的一些总结。计算机发明的出发点是用来计算的(算不算废话?),而线性代数是早就被广泛的应用到科学计算中的,因此线性代数的程序库很早就有了:
BLAS(Basic Linear Algebra Subprograms,基础线性代数程序集)是一个应用程序接口(API)标准,用以规范发布基础线性代数操作的数值库。该程序集最初发布于1979年,在高性能计算领域,BLAS被广泛使用。这玩意儿虽然只是一个标准,但是最早是由Netlib BLAS官方参考实现,用的程序语言为Fortran 77,在那个遥远的年代,所有的计算程序都是由Fortran写的。
CBLAS,时代在进步,慢慢的Fortran做为计算语言,使用的场景越来越少,C语言慢慢占据了统治地位,写C语言的也需要线性代数计算,但是C的语法、环境和Fortran都不一样,好在Fortran和C都算是底层语言,都是编译成机器语言执行的,应此只用将Fortran的BLAS所有API重新用C封装一次就行了,这就是CBLAS,这是针对C语言的接口。
LAPACK:(Linear Algebra PACKage),是以Fortran编程语言写的,用于数值计算的函式集。 BLAS只提供了线性代数的基本运算,最多也就到矩阵乘积,使用上还是不是特别方便,因此需要高层API的封装。LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。
LAPACKE:LAPACKE之于LAPACK,就像CBLAS之于BLAS,提供了C语言的接口
Atlas,OpenBLAS,MKL、ACML、NVBLAS这些都是BLAS的封装,也就是说它们提供了CBLAS(BLAS的C语言接口),但是底层的实现并不是Fortran了,比如MKL可以有针对Intel CPU的汇编级的优化
因为一般LAPACKE底层都是调用BLAS或者CBLAS的,所以LAPACKE就没有太多的重新实现,直接用Netlib的LAPACKE底层调用BLAS的优化实现就可以了。
clBLAS、cuBLAS:这些也是线性代数计算的,但是和BLAS、CBLAS并不兼容,所有的计算都在GPU里面完成
BLIS、eigen:这些都是最近兴起的线性代数算法库,完全放弃了对老的BLAS的兼容,采用全新的自定义的接口

Comments are closed.