数值计算中矩阵运算

1. 矩阵运算最简单的方法是使用matlib,因为在matlib中, 矩阵是基本的数据类型,其语法与数学运算基本一致,所以适合新手入手,但matlib也有很多不足之处。比如软件比较庞大,收费,以及效率等问题。

2. 使用Python的numpy库,几乎能代替matlib,但是程序的调试难度上升了一些,花的时间增加了。优点是轻量,部署效率高,能够快速放到服务器上跑,同时有一些第三方的轮子。缺点是Python本身的效率也偏低。

3. 选择Fortran和C++传统编译形语言

相对于 fortran,用 C++ 做数值计算的一个缺陷就是语言本身(或标准库) 没有矩阵类型(以及高维矩阵类型).而且在C++中使用第三方库的难度要比Python中难一些,linux环境下可能更容易。

数值计算中矩阵运算_第1张图片

1.这一段中错误比较多,直接定义的C++数组是在stack中定义的,在heap中定义需要new,更简单的办法是直接定义为全局变量,即在heap中。

2. vector效率低的原因,已经说得很清楚了。LAPACK库这里引入的比较突兀。

3. 目前2020年,Eigen3应该是C++中比较流行的矩阵运算库,大名鼎鼎的TensorFlow基于Eigen3开发。Eigen3的配置只需要头文件,在linux/mac OS环境非常容易。缺点是编写C++语言,开发难度会提高,开发效率会降低,调试难度会变大,报错比较复杂。但程序的稳定性,健壮性,效率会提高。一般如果要追求效率,会先用Matlib/Python实现算法,然后在移植到C++上做开发。

数值计算中矩阵运算_第2张图片

数值计算中矩阵运算_第3张图片

这里要明白,直接写一个矩阵计算的时间复杂度是O(N^3), 在算法导论上,有通过分治法(分块矩阵的办法)将时间复杂度优化O(N^2.367), 这里N是矩阵的维数。对于稀疏矩阵,更是可以将时间复杂度提到O(N), 另外,存在一系列的算法,来提高矩阵乘法的效率。另一方面,可以通过多核CPU的优化进一步提高矩阵相乘的效率。此不难理解为什么底层就是一个BLAS这样的接口,BLAS接口存在各种各样的实现,所以矩阵乘法也可以看做乘法的一种,是一种底层实现。

 

由此不难理解,LAPACK和Eigen本质上都是基于底层BLAS接口实现更高级的线性代数运行操作。

 

 

 

 

 

你可能感兴趣的:(算法)