Matlab中提高m文件执行效率的小技巧

来源:互联网 发布:泡泡堂 for mac 编辑:程序博客网 时间:2024/05/01 15:18
原文地址:Matlab中提高m文件执行效率的小技巧作者:intothesun

这篇文章是同学发给我的,不知原文出自哪里,介绍的基本上是有些用的小技巧,

关于for循环的应用,据我个人的经验,有些时候下述第一条产生的时间差别甚至会达到一个数量级,还是相当可观的。

不过提高matlab程序效率的最为根本的是结合matlab的特点,精简算法,曾经写过一个积分程序,在访问矩阵的时候,由于及时清除掉了冗余的部分,竟使得速度提高了200倍,而且矩阵规模越大,速度提高越是显著

---------------------------------------------------------

要提高M文件的执行效率,可采用下述的一些技巧。
1. 
尽量避免使用循环结构
MATLAB
变量的基本类型是矩阵,当对矩阵的每个元素循环处理时,运算速度很慢。因此编程时应尽量把数组和矩阵看作一个整体来进行编程,而不是像其他的程序设计语言那样,使用循环结构对矩阵的元素循环进行处理。利用MATLAB提供的用于矢量化操作的函数,把循环矢量化,这样既可以提高编程效率,也可以提高程序的执行效率。下面给出一个循环的例子:
i=0;
for 0:0.1:100
          i=i+1;
        y(i)=cos(n)
end

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

0:0.1:100;
cos(n)

通过使用MATLAB专门提供的测试程序运行时间的函数,可以发现,把数组看作一个整体,进行操作后,执行效率提高约300倍。

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

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

3. 
对矩阵元素使用下标或者索引操作
MATLAB中,矩阵元素的引用可用两个下标来表示。例如:A(i,j) 表示矩阵的第i行第j列的元素;A(1:k,j)表示矩阵A的第j列的前k个元素;A(:,j) 表示矩阵的第j列的所有元素。求矩阵A的第j列元素的平均值的表达式为mean(A(:,j))

4. 
尽量多使用函数文件少使用脚本文件
因为每次调用MATLAB的脚本文件都需要将不必要的中间变量加载到内存中,每执行一次,就加载一次。函数在调用时被编译成了伪代码,只需要加载到内存一次。当多次调用同一个函数时会运行快一些。因此尽量多使用函数文件而少使用脚本文件,也是提高执行效率的一种方法。

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

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

7. 
内存管理函数和命令
●     Clear variablename
:从内存中删除名称为variablename的变量。
●     Clear all
:从内存中删除所有的变量。
●     Save
:将指令的变量存入磁盘。
●     Load
:将save命令存入的变量载入内存。
●     Quit
:退出MATLAB,并释放所有分配的内存。
●     Pack
:把内存中的变量存入磁盘,再用内存中的连续空间载回这些变量。考虑到执行效率问题,不能在循环中使用。

8. 
节约内存的方法
●     
避免生成大的中间变量,并删除不再需要的临时变量。
●     
当使用大的矩阵变量时,预先指定维数并分配好内存,避免每次临时扩充维数。
●     
当程序需要生成大量变量数据时,可以考虑定期将变量写到磁盘,然后清除这些变量。当需要这些变量时,再重新从磁盘加载。
●     
当矩阵中数据极少时,将全矩阵转换为稀疏矩阵。

原创粉丝点击