当前位置: 首页>编程语言>正文

python和matlab科学计算 python和matlab计算速度

没转行前搞土建,大四时在导师公司实习做一个力学软件的求解器,核心就是搞稀疏正定对称矩阵的方程和广义特征值求解,最终差不多达到了matlab的性能。如果单纯地对着数学算法撸一遍代码去和matlab的稀疏矩阵比性能,差个一百倍我也不惊讶。

matlab的矩阵运算主要分稠密矩阵运算和稀疏矩阵运算:

稠密矩阵运算:其他答案基本提到的是这种,没啥好说的,主要是调用实现blas,lapack等接口的底层库,比如mkl,gotoblas,openblas等。和自己手写的比,主要的优化在simd加速,矩阵分块,cache命中率等上。

稀疏矩阵运算:工程上偏微分方程的数值求解基本会通过线性化手段转化为求解一个稀疏矩阵。如果用稠密矩阵的思路搞,10万大小的矩阵单存储就得花掉80G。稀疏矩阵求解本身又分直接法(矩阵分解)和迭代法,迭代法难度不大,差不多就是对着数学算法撸(如果采用预条件处理也会涉及直接法类似的算法),直接法要写好难度挺大的,优化的关键主要是:

1. 数据结构:一般采用压缩行、压缩列格式。有些垃圾教程上写用十字链表存就是瞎扯淡;

2. 矩阵重排: 重排的本身耗时很低(整个算法的1%不到),但是最为关键。重排后的矩阵能够有效减小分解后矩阵的大小;

3. 符号分解:可以认为是一个模拟分解的过程,确定好分解后矩阵的非零元素的布局(耗时1%左右);

4. 数值分解:进行实际的数值分解过程,耗时95+%;

5. 拿着分解好的矩阵去进行实际方程的求解;

即便上面的所有步骤能确保做得完美无误,和matlab比还会有两三倍的差距。还有优化的空间:在第3步算出来矩阵的非零布局后,可以将非零布局差距不大的列合并成一个大整体参与运算。这时候就可以用稠密矩阵的算法了。高性能的mkl,openblas用起来性能也就蹭蹭上去了。


https://www.xamrdz.com/lan/5u91963827.html

相关文章: