内容发布更新时间 : 2024/11/19 11:37:17星期一 下面是文章的全部内容请认真阅读。
用过Matlab的人都知道,Matlab是一种解释性语言,存在计算速度慢的问题,为了提高程序的运行效率,matlab提供了多种实用工具及编码技巧。
1. 循环矢量化
Matlab是为矢量和矩阵操作而设计的,因此,可以通过矢量化方法加速M文件的运行。矢量化是指将for循环和while循环转换为等价的矢量或矩阵操作。下面给出一个循环的例子: i=0;
for n = 0:0.1:1000 i=i+1;
y(i)=cos(n); end
那么我们可以矢量化为: n= 0:0.1:1000; y=cos(n);
我们可以用tic和toc函数来查看上述各代码运行的时间,采用for循环的程序0.39秒(具体时间和计算机配置有关),而矢量化后几乎耗时为0。
2. 给数组或矩阵预分配内存
特别是使用大型数组或矩阵时,Matlab进行动态内存分配和取消时,可能会产生内存碎片,这将导致大量闲置内存产生,预分配可通过提前给大型数据结构预约足够空间来避免这个问题。
3. 用函数代替脚本文件
因为每次调用MATLAB的脚本文件都需要将不必要的中间变量加载到内存中,每执行一次,就加载一次。函数在调用时被编译成了伪代码,只需要加载到内存一次。当多次调用同一个函数时会运行快一些。因此尽量多使用函数文件而少使用脚本文件,也是提高执行效率的一种方法。
4. 用Mex文件编写循环代码
Matlab提供了与C和C++的接口,那么我们可以在用C或C++语言编写耗时的循环代码,然后通过接口程序在Matlab中转换成dll文件,这就是我们所要的Mex文件,通过这种方法可以极大地提高计算速率。
1. 尽量避免使用循环结构
MATLAB变量的基本类型是矩阵,当对矩阵的每个元素循环处理时,运算速度很慢。因此编程时应尽量把数组和矩阵看作一个整体来进行编程,而不是像其他的程序设计语言那样,使用循环结构对矩阵的元素循环进行处理。利用
MATLAB提供的用于矢量化操作的函数,把循环矢量化,这样既可以提高编程效率,也可以提高程序的执行效率。下面给出一个循环的例子: i=0;
for n = 0:0.1:100 i=i+1;
y(i)=cos(n) end
上述程序段把数组中的每个元素都进行函数值计算,这样会耗费大量的运算时间,我们可以把数组看作一个整体来处理,计算函数值,可以修改这个程序段如下。
n = 0:0.1:100; y = 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-MEX。C-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. 内存管理函数和命令
(1)Clear variablename:从内存中删除名称为variablename的变量。 (2)Clear all:从内存中删除所有的变量。 (3)Save:将指令的变量存入磁盘。
(4)Load:将save命令存入的变量载入内存。
(5)Quit:退出MATLAB,并释放所有分配的内存。
(6)Pack:把内存中的变量存入磁盘,再用内存中的连续空间载回这些变量。
考虑到执行效率问题,不能在循环中使用。 8. 节约内存的方法
(1)避免生成大的中间变量,并删除不再需要的临时变量。
(2)当使用大的矩阵变量时,预先指定维数并分配好内存,避免每次临时扩充维数。
(3)当程序需要生成大量变量数据时,可以考虑定期将变量写到磁盘,然后清除这些变量。
当需要这些变量时,再重新从磁盘加载。
(4)当矩阵中数据极少时,将全矩阵转换为稀疏矩阵。
提高MATLAB程序效率的几点原则,这些都是俺在这两年中参加四次数模编写大量m程序总结的经验,加之网上很多英雄也是所见略同。 1.“计算向量、矩阵化,尽量减少for循环。”[/B]
因为MATLAB本来就是矩阵实验室的意思,他提供了极其强大而灵活的矩阵运算能力,你就没必要自己再用自己编写的for循环去实现矩阵运算的功能了。另外由于matlab是一种解释性语言,所以最忌讳直接使用循环语句。但在有些情况下,使用for循环可以提高程序的易读性,在效率提高不是很明显的情况下可以选择使用for循环。
口说无凭,下面是利用tic与toc命令计算运算所用时间的方法,测试两种编程的效率。需要说明的是没有办法精确计算程序执行时间,matlab帮助这样写到“Keep in mind that tic and toc measure overall elapsed time. Make sure that no other applications are running in the background on your system that could affect the timing of your MATLAB programs.”意思是说在程序执行的背后很可能有其他程序在执行,这里涉及到程序进程的的问题,m程序执行的过程中很可能有其他进程中断m程序来利用cup,所以计算出来的时间就不仅是m程序的了,在这种情况下我把那些寄点去掉,进行多次计算求他的平均时间。
n = 100;
A(1:1000,1:1000) = 13; C(1:1000,1) = 15; D(1:1000,1) = 0; for k = 1:n D(:) = 0; tic
for i = 1:1000 for j = 1:1000
D(i) = D(i) + A(i,j)*C(j); end end
t1(k) = toc;
%------------------