- 向量化。养成看到for就浑身不舒服的本能反应。
- 矩阵如果太大了会爆内存则千万别向量化,老老实实用循环吧。有些3-4纬的矩阵,用循环处理起来甚至快一些。
- 循环竖着走比横着走快。
- 不少内置函数都有大量的error check。直接用profiler找出真正干活的。
- 不少内置函数在网上都有人提供了更快的版本的,当然功能弱一些,正好符合提速的需求。
- 视情况,有时可以把变量强行变成single,速度暴增。
- 利用copy on write的特点,丢进函数的变量能不对其修改就不要修改。
- matlab就是个高级计算器,不要拿干来处理文件,往数据库里塞数据这种活。eval, object之类的东西能别碰就别碰,尽量保持着every is an array of double的模式。
- 不要把代码全塞到一行。不但难看有时候还慢一些。
链接:https://www.zhihu.com/question/31028195/answer/121589291
- 循环向量化
- 利用函数的矩阵输入功能批量处理
- 必须用for且费时的地方改成单层parfor,要是循环次数比cpu核数还少反而会拖慢程序
- 非常大的矩阵的运算可以用gpuArray(这个在matlab 深度学习工具箱中深有体会)
- 能用矩阵不要用cell,速度慢且占内存巨多
- 对调用频繁且费时的地方尝试生成c ,写成mex
- 按编译器提示先初始化矩阵大小(但我大部分时候还是懒得预先算矩阵大小…)
- Matlab 是可以多开的,如果parfor不能改或者懒得改可以“人肉parfor”,也就是把一个for拆成几段然后多开几个matlab 一起执行,最后再合并结果,比较暴力哈哈
- 费时的程序最后加个email发送程序,跑完直接把结果发邮箱里
链接:https://www.zhihu.com/question/31028195/answer/575537232
-
预先定义好变量的维度
类似于数组的变量都是连续存放在内存里,如果每次赋值时都要change size的话,MATLAB只好重新找一块连续的内存放这些数据,增加了数据在内存里不必要的读取存储。 -
使用函数句柄
【矢量化大法好】【GPU大法好】
GPU加速
GPU(NVIDIA显卡的GPU加速)的流处理器个数远多于CPU核心数,并行如果放到显卡里对运算的优化是显而易见的。