MATLAB 嵌套函数,子函数,私有函数,重载函数

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和fplot
ezplot是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之后的变量

原文地址:https://www.cnblogs.com/MarshallL/p/4048846.html