MATLAB程序优化的常用方法
同样的功能可以采用不同的编程方法实现,不同的编程方法运行速度不同。本节将介绍一些提高 M 文件执行速度、优化内存管理的常用方法,包括循环向量化和数组内存预分配等。
循环向量化
MATLAB 的一个缺点是当对矩阵的单个元素作循环时运算速度很慢。编程时,把循环向量化,不但能缩短程序的长度,更能提高程序的执行效率。
由于 MATLAB 的基本数据类型为矩阵和向量,所以编程时应尽量对向量和矩阵编程,而不是对矩阵元素进行编程。
示例1
向量化 for 循环,具体程序如下:
% loop.m tic x=1; for k=1:1001 y(k)=log10(x); x=x+0.01; end toc >> loop
时间已过 0.019843 秒。
示例2
向量化 for 循环的另一种操作方法,具体程序如下:
% vetcor_loop.m tic x=1:0.01:10; y=log10(x); toc >> vector_loop
时间已过 0.003630 秒。
数组内存预分配
在 for 循环或 while 循环中,如果数组大小随着循环而增加,则会严重影响内存的使用效率。如下面的代码:
x=0; for k=2:1000 x(k)=x(k-1)+5; end
该代码首先创建变量 x,其值为 0,在 for 循环中,将其扩展为长度为 1000 的一维数组。在每一次扩展中,系统需要寻找更大的连续内存区域,用于存放该数组,并将数组从原地址移动到新地址中。
该代码可以通过下面的代码实现:
x = zeros(1, 1000); for k = 2:1000 x(k) = x(k-1) + 5; end
在该代码中,首先为数组 x 分配内存区域,将x的所有元素赋值为 0。这样可以节约重新分配内存的时间,提高程序的效率。
MATLAB 中,可以用于分配内存的函数有 zeros 和 cell,分别用于对数值数组和单元数组进行内存分配。
用 zeros 为数组分配内存时,如果数组的类型是 double 以外的类型,则应利用下面的语句进行:
A=zeros(100,'int8');
该语句为 A 分配 100×100 的 int8 类型的内存。
A=int8(zeros(100));
该语句为 A 分配 100×100 的 double 类型的内存,再将其转换为 int8 类型。
其他方法
- 对数组赋值时避免改变数组的类型或者数组的大小。
- 对实数进行操作,尽量避免对复数的操作。
- 合理使用逻辑运算符。
- 避免重载 MATLAB 中的内置函数和操作符。
- 通常情况下函数的运行效率高于脚本文件。
- load 和 save 函数效率高于文件输入输出函数。
本文标题:MATLAB程序优化的常用方法
发表评论