怎么提高matlab运行速度

Matlab是一种解释性语言,存在计算速度慢的问题,为了提高程序的运行效率,matlab提供了多种实用工具及编码技巧。

1. 循环矢量化,尽量避免使用循环结构

Matlab是为矢量和矩阵操作而设计的,因此,可以通过矢量化方法加速M文件的运行。

矢量化是指将for循环和while循环转换为等价的矢量或矩阵操作。下面给出一个循环的例子:

1
2
3
4
5
6
7
8
9
i=0;
 
for n = 0:0.1:1000
 
i=i+1;
 
y(i)=cos(n);
 
end

上述程序段把数组中的每个元素都进行函数值计算,这样会耗费大量的运算时间,我们可以把数组看作一个整体来处理,计算函数值,可以修改这个程序段如下。

1
2
3
n= 0:0.1:1000;
 
y=cos(n);

用tic和toc函数来查看上述各代码运行的时间,采用for循环的程序0.39秒(具体时间和计算机配置有关),而矢量化后几乎耗时为0。

可以发现,把数组看作一个整体,进行操作后,执行效率提高约300倍。

另外,在必须使用多重循环的情况下,建议在循环的外环执行循环次数少的,内环执行循环次数多的,这样也可以显著提高程序执行速度。

最常用的使用vectorizing技术的函数有:All、diff、ipermute、permute、reshape、ueeze、y、find、logical、prod、shiftdim、sub2ind、cumsum、ind2sub、ndgrid、repmat、sort、sum等。”

2.在使用数组或矩阵之前先定义维数,给数组或矩阵预分配内存

MATLAB中的变量在使用之前不需要明确地定义和指定维数。但当未预定义数组或矩阵的维数时,当需赋值的元素下标超出现有的维数时,MATLAB 就为该数组或矩阵扩维一次,这样就会大大降低程序的执行效率。因此,在使用数组或矩阵之前,预定义维数可以提高程序的执行效率。

在MATLAB中,矩阵元素的引用可用两个下标来表示。例如:A(i,j)

表示矩阵的第i行第j列的元素;A(1:k,j)表示矩阵A的第j列的前k个元素;A(:,j)

表示矩阵的第j列的所有元素。求矩阵A的第j列元素的平均值的表达式为mean(A(:,j))。

特别是使用大型数组或矩阵时,Matlab进行动态内存分配和取消时,可能会产生内存碎片,这将导致大量闲置内存产生,预分配可通过提前给大型数据结构预约足够空间来避免这个问题。

3. 用函数代替脚本文件

因为每次调用MATLAB的脚本文件都需要将不必要的中间变量加载到内存中,每执行一次,就加载一次。

函数在调用时被编译成了伪代码,只需要加载到内存一次。当多次调用同一个函数时会运行快一些。

因此尽量多使用函数文件而少使用脚本文件,也是提高执行效率的一种方法。

4. 用Mex文件编写循环代码

Matlab提供了与C和C++的接口,那么我们可以在用C或C++语言编写耗时的循环代码,然后通过接口程序在Matlab中转换成dll文件,这就是我们所要的Mex文件,通过这种方法可以极大地提高计算速率。

当必须使用耗时的循环时,可以考虑将循环体中的语句转换为C-MEX。C-MEX是将M文件通过MATLAB的编译器转换为可执行文件,是按照MEX技术要求的格式编写相应的程序,通过编译连接,生成扩展名为.dll的动态链接库文件,可以在MATLAB环境下直接执行。这样,循环体中的语句在执行时不必每次都解释(interpret)。一般来说,C-MEX文件的执行速度是相同功能的M文件执行速率的20~40倍。编写C-MEX不同于M文件,需要了解MATLAB C-MEX规范。幸运的是MATLAB提供了将M文件转换为C-MEX的工具。

5.内存优化

MATLAB在进行复杂的运算时需要占用大量的内存。合理使用内存和提高内存的使用效率,可以加快运行速度,减少系统资源的占用。

(1)避免生成大的中间变量,并删除不再需要的临时变量。

(2)当使用大的矩阵变量时,预先指定维数并分配好内存,避免每次临时扩充维数。

(3)当程序需要生成大量变量数据时,可以考虑定期将变量写到磁盘,然后清除这些变量。当需要这些变量时,再重新从磁盘加载。

(4)当矩阵中数据极少时,将全矩阵转换为稀疏矩阵。

内存管理函数和命令:

(1)Clear variablename:从内存中删除名称为variablename的变量。

(2)Clear all:从内存中删除所有的变量。

(3)Save:将指令的变量存入磁盘。

(4)Load:将save命令存入的变量载入内存。

(5)Quit:退出MATLAB,并释放所有分配的内存。

(6)Pack:把内存中的变量存入磁盘,再用内存中的连续空间载回这些变量。考虑到执行效率问题,不能在循环中使用。

6.同时运行多个matlab

暴力解决,将数据拆成几个小份,同时运行多个matlab。程序运行之后内存占用很大,但是依然可以同时运行几个matlab处理数据。

 

7.gpu加速matlab

在matlab命令行窗口内通过‘gpuDevice’查看显卡是否具备加速功能

Matlab+GPU加速学习笔记(一) - 邪恶的亡灵 - 博客园 (cnblogs.com)

————————————————————————————————————————————————

参考文献:1.https://blog.csdn.net/weixin_39751327/article/details/111436104

     2.MATLAB程序加速——除了多线程,还有别的办法吗? - 知乎 (zhihu.com)

 

posted @   学习记录本  阅读(5368)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示