zoukankan      html  css  js  c++  java
  • 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之后的变量

  • 相关阅读:
    SLAM+语音机器人DIY系列:(二)ROS入门——3.在ubuntu16.04中安装ROS kinetic
    SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
    2017年 年计划
    125. Valid Palindrome
    一道多树递归面试题
    顺序表查找和有序表查找
    c++中常见概念、关键字等的区别
    两个栈实现一个队列,两个队列实现一个栈
    150. Evaluate Reverse Polish Notation
    堆排序
  • 原文地址:https://www.cnblogs.com/MarshallL/p/4048846.html
Copyright © 2011-2022 走看看