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

更多...

加载中...