MATLAB 函数嵌套
MATLAB中M文件有两种类型,脚本M文件和函数M文件。脚本M文件是将可执行程序语句放入M文件中,就像在命令窗口那样,按其语句顺序及逻辑关系执行,可以理解为一般的顺序执行程序语句。函数文件一般是声明一个函数,方便以后操作中的调用。下面就函数文件中函数嵌套的使用做简单分析。
对于函数文件,一个M文件只能定义一个总函数,即第一句function所定义的函数,而且整个M文件在外部使用时候表现出来的也只有这一个函数。如果需要多个函数嵌套,与其定义顺序无关。下面结合一个简单的例子来分析。
function y=average(x) %声明一个函数,y=average(x),这个函数是取x的平均值,返回值是y y=mymean(x); %再次使用函数mymean,此处该函数并没有定义算法,而是在后面对其进行描述 function a=mymean(v) %定义函数mymean,对于上级函数来说,此处为定义子函数,进行函数嵌套 %a=mean(v); %此处为了简便,使用内部求均值函数mean,当然也可以自己写,如下句。 a=sum(v)/length(v); %对v求和并除以总长度可得其平均
我们设一个向量z=[1,2,3,4,5,6,7],然后求其平均,在命令窗口输入average(z)即可。相当于将z分别赋给x和v,由子函数得出返回值a,a和y是等价的,外层可输出返回值。若去掉y=mymean(x)这句,则总函数外部无返回值输出。
Matlab子函数
在matlab的函数定义中,如果函数如果函数较长或较多,往往可以将各函数分别写在多个.m文件中,但有时函数可能很短,就几行,可能希望将多个函数定义放在同一个.m文件中,这里就存在一个子函数的定义问题。
在matlab中一个.m文件中可以有多个的子函数,但仅能有一个主函数,并且M文件名必须和主函数相同[1]。(注:本人经自己试验发现,自己使用的matlab7.5版本并不要求主函数名和.m文件名相同,但调用的时候使用的仍然必须是.m文件名,所以为了理解和记忆的方便,仍然建议M文件名和主函数名同名。)
其使用方法如下图,图1:
图1
在这个.m文件中共有三个函数,其中subfunction是主函数,而add和subtract是两个子函数,在函数调用是使用的是文件名subfunction_cxd(x,y),如[a,b]=subfuction_cxd(1,1),而如果仅是调用主函数的话,则会出现未定义的错误提示,如下图,图2:
图2
我们甚至可以将函数的调用也写到同一个.m文件中,如以下这个例子,见图3:
图3
这里我们定义了一个没有输入没有输出的函数该函数将作为主函数,而其他的函数均为子函数,由主函数调用子函数,而子函数间是可以互相调用,但不能调用主函数。这时的m文件不需要任何输入,调用时可以直接点运行m文件的快捷键,或者在命令框中输入m文件名然后回车运行,如上例输入命令subfunction_cxd回车即可得到结果。
M文件中以下这种将函数的调用直接写到m文件中的情况是不允许的,如图4,出现错误提示如图5,必须也把调用写成函数的形式,或者将子函数都写成单独的m文件。
图4
图5
有时若有需要,子函数的定义甚至可以放在主函数中,即函数的嵌套,如图6。这种嵌套函数是在函数第一次调用时就加以定义,一旦使用了嵌套函数,无论是嵌套函数还是主函数都必须以end作为函数的结束。当然子函数一旦定义将可在主函数中任意位置调用,如例子中求a时,定义了加法,但求c时仍然可以调用,无需再次定义。注:主函数结束时有一个end表示主函数结束切不可少。
图6
编写完函数后,如果有需要,可以吧自己所定义的函数成组的存储在公共目录下,即存在工具箱中,通过修改搜索路径进行访问,修改MATLAB的搜索路径可以在主菜单File中的Set Path进行,也可以在命令框中输入pathtool,获取下图路径设置,见图7。存储后的函数在路径下将可以直接调用。
图7
matlab子函数私有函数
1.private与子函数: 子函数只能在主函数内容中调用,在函数外无法使用
function MainFunction %主函数内容 function SubFunction1 %子函数内容 end function SubFunction2 %子函数内容 end function SubFunction3 %子函数内容 end end
private函数是matlab软件中广泛使用的一种技术,其作用是限定某一些函数(private文件夹内)只能被令一些函数(private文件夹所在文件夹中的函数)使用,其他函数不能使用,这样的话就可以避免一些无用(因为一般的matlab函数是全局可见的,而private函数只能被private文件夹所在文件夹中的函数调用。 2.ezplot和fplotezplot是easy plot的简称,意思就是简化画图,只需给出函数体而无需变量范围,例如想画个圆,用ezplot就很方便:
syms x y ezplot(‘x^2+y^2=1‘,[-1.5 1.5],[-1 1])
fplot的意思是function plot,就是画某一函数的曲线。顾名思义,若要画一条函数的曲线,只要给出函数名和自变量范围即可,例子如下:fplot(‘sin‘,[-2 2])
matlab函数重载
C语言中可以通过参数的个数和数据类型来区分同名函数,实现函数的重载。
matlab的函数重载是通过检查函数调用时输入输出的项数来实现。
nargin和nargout分别返回它所在函数当前被调用时实际输入的项数
nargchk()检查输入的参数个数是否符合指定的范围:
msgstr=nargchk(minargs,maxargs,numargs)
msgstr=nargchk(minargs,maxargs,numargs,‘string‘)
其中,minargs和maxargs合法的最大值最小值,numargs为求得的输入项的项数,可直接为函数nargin
如果输入变量个数超出范围,则返回错误信息;如果变量个数在范围内则返回空矩阵。
例:实现两个数相加或者三个数相乘
function B = addd(varargin) % varargin是matlab内部变量,cell型,依次存储函数的所有输入变量 % 如add(A1, A2, A3), 则 varargin{1} = A1, varargin{2} = A2, varargin{3} = A3 % nargin同样也是matlab内部变量, 为函数输入 变量的个数 %如果变量个数小于2大于3,则报错 error(nargchk(2,3,nargin)); if nargin == 2 A1 = varargin{1}; A2 = varargin{2}; B=A1+A2; else A1 = varargin{1}; A2 = varargin{2}; A3 =varargin{3}; B=A1*A2*A3; end ; >> addd(1) Error using addd (line 2) Not enough input arguments. >> addd(1,2,3,4) Error using addd (line 2) Too many input arguments. >> addd(7,2,3) ans = 42
varargin变量用法灵活,如 function add(var1,var2,varargin)
此时varargin存储的是var1和var2之后的变量