MATLAB 口定义函数及局部变量
2009-11-20 09:17
在开始学习MATLAB的时候并没有发现这个软件有着这么强大的功能,随着课题的不断深入,也在逼迫着自己不断的去应用新的公式并开发新的算法,这就牵涉到了如何在MATLAB中口定义函数的问题,随之而来口然就是所有编程语言所面临的问题,函数调用、局部变量等等。
下面就我自己整理的一些心得与大家交流。
希望对你也有所帮助。
1、编写自定义函数时尽量分以下四部分:
(1)函数定义行:function[outl, out2,.. ]=filcname (ini, in2,..),输入和输岀参数个数分别由nargin和nargout两个MATLAB保留的变量来给岀。
(2)第一行帮助行,以%开头,作为1 ookfor指令搜索的行
(3)函数体说明及有关注解:以(%)开头,用以说明函数的作用及有关内容。
如果不希望显示某段信息,可在它的前面加空行
(4)函数体:函数体内使用的除返回和输入变量这些在function语句屮直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会口动在MATLAB的工作空间中清除掉。
如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量。
例如卜•血就是一个标准的口字义函数。
function A=myhilb(n, m)
% MYH1LB是一个示范性的M-function・
% A=MYHILB(N, M)会生成一个NXM 的Hilbert 矩阵 A.
% A二MYHILB(N)会生成一个NXN 的Hilbert 矩阵.
% MYI1ILB(N,M)仅仅显示一个II订bert矩阵,而不会返冋任何矩阵。
%这些内容在用help时不会显示
if nargout>l, error Too many output arguments.') ; end
if nargin=l, m=n;
el seif nargin=0 nargin>2
error Wrong number of iutput arguments.');
end
Al二zeros (n, m);
for i=l: n
for j=l:m
Al(i, j)=l/(i+j-l);
end
end
if nargout~l, A=A1;
elseif nargout==0, disp(Al);
end
把该函数保存在MATLAB的某个搜索路径中(比如work目录中),在命令窗口输入:
>> help myhilb
MYH1LB是一个示范性的M-function.
A=MYH1LB(N, M)会生成一个NXM 的Hilbert 矩阵 A.
A=MYHILB(N)会生成一个NXN的H订bert矩阵.
MYHTLB(N,M)仅仅显示一个Hilbert矩阵,而不会返回任何矩阵。
>> lookfor myhilb
MYHILB是一个示范性的M-function.
2> MATLAB中全局变量与局部变量有什么区别?
答:如果一个函数内的变量没有特别声明,那么这个变量只在函数内部使用, 即为局部变量。
如果两个或多个函数共用一个变量(或者说在子程序屮也要用到主程序中的变量,注意不是参数),那么可以用global来将它声明为全局变量。
全局变量的使用可以减少参数传递,合理利用全局变量可以提高程序执行的效率。
如果需要用到其他函数的变量。
就要利用在主程序与子程序屮分别都声明全局变量的方式实现变量的传递。
否则函数体内使用的都为局部变量。
比如下例:
3、怎样编写递归函数?
答:在建立数学模型时,经常会遇到利用递归表达的式子,这种数学表达式简单明了,在MATLAB 111实现该模型,对应的需要建立递归函数。
写一个好的递归函数,关键是找到递归的边界条件,和在中间某步骤中会发生的各种情况,然后再对应到程序中即可。
试看Hanoi塔例了:要将塔座A上的刀个鬪盘全部转移到塔座C 上,如n二1,直接把这一片移到目标柱子即可;若n>l,可以先把塔座A上的个圆盘想法转移到塔座B上,然后把塔座A上的最后一个大圆盘转移到塔座C上,最后再把塔座B上的个圆盘转移到塔座C±o把上而思想对应到递归程序屮,就得到如下代码:
function
result=hanoi(di sknum,begi npi 11 ar, mi dpi 11 ar, endpi 11 ar, sch) if disknum二二1%添加一行移动方式,递归的边界
result二[sch;1, beginpillar, cndpillar];
else%下面一句相当于把上面n-1片移到中间柱子
result=hanoi(disknum-1, beginpillar, endpillar, midpillar, sch);
%然后把最后一片移到s标柱子上
result二[result;disknum, bcginpillar, cndpillar];
%把中间当作第一•根,原來第一•根当作中间柱子,继续移动
result二hanoi(disknum-1, midpi1lar, beginpi 1lar, endpi1lar, result); end。