MATLAB编程技巧

[摘要]

MATLAB是一种科学计算语言,和C、Fortran等高级语言相类似,能方便的实现程序控制。以下介绍一点matlab编程的技巧。

嵌套计算

程序执行的速度取决于调用的子程序的个数和算法实现。通常希望子程序越少越好。嵌套可以有效地减少子程序。

一个典型的例子就是多项式的求值计算:p(x)=a3x3+a2x2+a1x+a0p(x)=((a3x+a2)x+a1)x+a0两者的结果相同,但是计算量不一样。

N=100000;
a=[1:N];
x=1;
tic
p1=sum(a.*x.^[N-1:-1:0]);
p1, toc
tic,p2=a(1);
for i=2:N
    p2=p2*x+a(i);
end
p2,toc
tic,p3=polyval(a,x),toc

p1 =

   5.0001e+09

时间已过 0.079124 秒。

p2 =

   5.0001e+09

时间已过 0.018267 秒。

p3 =

   5.0001e+09

时间已过 0.212526 秒。

例:计算possion分布:S(M)=∑Mn=0λnn!e−λ当M很大的时候的值。

tic
r=80;
M=160;
sum=0;
for n=1:M
    temp=1;
    for k=1:n
        temp=temp*k;
    end
    sum=sum+r^n/temp*exp(-r);
end
sum,toc

sum =

    1.0000

时间已过 0.002170 秒。

循环结构

matlab中的循环语句主要有for和while。其基本格式为:

  • for循环

for 循环变量=初值:步长:终值

循环体语句

end

  • while循环

while 条件

循环语句

end

注意事项:

  1. 尽量避免使用循环。matlab中循环速度较低,应该尽量使用向量运算代替循环。
  2. 为了提高速度,在for循环之前,应该分配数组。
  3. 有限考虑内联函数(inline)。
  4. 应用MEX技术。

循环和嵌套

程序的嵌套是指在程序执行的过程中调用自身的过程。又称为递归调用。

例如:计算100!

  • 利用循环
tic
M=100;
f=1;
for i=2:M
    f=f*i;
end
f,toc

f =

  9.3326e+157

时间已过 0.000259 秒。
  • 利用嵌套
function m=hello(n)
if n<=1
    m=1;
else 
    m=n*hello(n-1);
end

>> tic,hello(100),toc

ans =

  9.3326e+157

时间已过 0.002535 秒。
可见自身嵌套速度较慢。

例外处理机制

编程人员要时刻注意:尽量多的为用户考虑,让程序及时的把正确的结果返回,如果出现错误,也会有好的提醒用户错误的原因以及改正的方法。


全局变量的使用

全局变量是指在不同的工作空间以及基本的工作空间中可以共享的变量。用户只需在主程序或者任何子程序中声明一个或者多个全局变量,则函数和主程序中都可以直接饮用它们。声明格式如下:

global v1 v2 v3 … vn (表达式就之间用空格隔开)

使用全局变量要注意的事项:

  1. 它可以在主程序和函数之间不需要经过输入或者输出就直接传递数据。但要注意在调用结束后,全局变量依然存在。
  2. 两个或者多个函数可以共有一个全局变量,只要同时在这些函数中用global语句加以定义即可。
  3. 使用全局变量要很小心才是,最好把全局变量全部大写,以免与函数中的局部变量重名。
  4. 一旦声明了全局变量,则在程序的任何地方都可以对其修改,这破坏了程序的相对独立性。(个人觉得能少用,就尽量少用这个功能。)

通过varargin传递参数

在编写函数的时候,varvargin只能做为函数的最后一个参数,主要传递函数中调用的子函数的可选项的参数,其大小也随着输入参量的变化而发生改变。