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 函数效率高于文件输入输出函数。