前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab系列之函数嵌套

Matlab系列之函数嵌套

作者头像
狂人V
发布2020-07-14 16:45:11
1.4K0
发布2020-07-14 16:45:11
举报
文章被收录于专栏:电子狂人

昨天的那一篇讲的几个函数,不知道你们理解的如何,是否懂得怎么去使用了,如果还没懂,一定要再多看几遍,并且去在软件上进行实操,今天的话,将要介绍一下函数的嵌套,不过在正式讲嵌套之前,先对主函数和子函数做下了解。

主函数

一般来说,函数M文件中的第一个函数就是主函数,之后任意数量的函数都是子函数,主函数也就是以其函数名命名的函数,因此可以被该文件外的其他文件中的函数或者脚本调用。

子函数

一个函数M文件中,除主函数之外的都是子函数,子函数只能够被该文件中的其他函数调用,每个子函数都是以“function”开始,直至下一个函数的定义或者文件的结尾才结束,子函数的顺序可以随意,但是主函数一定是要最开始出现的。

接下来对主函数和子函数的格式编写一个程序,然后简单调用看下其运行结果:

程序:

代码语言:javascript
复制
function [avg,med] = newstats(u)%主函数
%返回数组的均值和中间值
n=length(u);
avg=mean(u,n);
med=median(u,n);
function a=mean(v,n)%子函数
%计算平均值
a=sum(v)/n;
function m=median(v,n)%子函数
%计算中值
w=sort(v);
if rem(n,2)==1
    m=w((n+1)/2);
else
    m=(w(n/2)+w(n/2+1))/2;
end

结果:

再说一下在M文件中调用函数的流程,调用时遇到函数,会先判断是否为子函数。然后判断是否为私有函数,最后才判断是不是当前目录下的其他函数M文件或者系统内置的函数。

私有函数

刚好讲到私有函数,就顺便对它简单介绍下,私有函数就是MATLAB安装目录下,位于“private”这个目录下的函数M文件,构造和我们自己创建的函数一个样,不过私有文件只可以被private目录的上级目录下的函数M文件调用,而不能被脚本文件调用,也不能被其他目录下的任何M文件调用。

嵌套函数

讲完主函数和子函数,现在开始嵌套函数的记录,这个理解起来就很简单了,最容易理解的就是多层嵌套结构,就相当于套纸杯,一个套一个的感觉,看下它的程序结构就知道了:

代码语言:javascript
复制
function x=A(p1,p2)
......
    function y=B(p3)
    ......
        function z=C(pN)
        ......
        end
    .......
    end
.......
end

除了这种多层嵌套的结构,还有一种平级嵌套结构,就相当于一堆小球放一个纸箱子里,纸箱子就是级别最高的那个函数,然后其他小球都是同级别的函数,再来看看它的程序结构:

代码语言:javascript
复制
function x=A(p1,p2)
......
    function y=B(p3)
        ...
    end
    function y=C(p4)
        ...
    end
    function y=N(pN)
        ...
    end
end

嵌套规则

讲完了两种嵌套的结构,或许你们在想,这些函数嵌套后,函数之间的调用会有什么规则吗?

没错,有一定规则的,嵌套函数可以被该嵌套函数的上一层函数使用、也可以是同一个母函数的同级嵌套函数使用、甚至可以被任意一个低级别的函数调用,如果没太看懂意思,来看一个简单的示例,再理解上面讲的嵌套函数被调用的规则:

程序:

代码语言:javascript
复制
function A(x,y)
B(x,y);
D(x,y);
    function B(x,y)
        C(x);
        D(x);
        function C(x)
            B(x,y);
            D(x,y);
        end
    end
    function D(x,y)
        B(x,y);
        E(x);
        function E(x)
            B(x,y);
            D(x,y);
        end
    end
end

该程序中可以很明显的看出,函数A能调用B和D,但是不能调用C和E;函数B可以调用C和D;函数D可以调用B和E,函数C可以调用B和D,函数E也可以调用B和D;看完这段程序后,再返回看调用规则就可以学会使用了。

夜未深,人未眠,继续刚

夜未深,人未眠,就用上一篇讲到的函数参数配上今天讲的嵌套玩一玩吧,顺便加深下大家的印象。

因为嵌套函数和主函数是使用的相同的函数工作区,所以,varargin和varargout既可以表示为嵌套函数的输入输出变量,也可表示为主函数的输入输出变量。

那该怎么进行区分呢?

这就需要写好程序中的变量声明了,如果嵌套函数在函数声明里包含了varargin或varargout,则在函数内部调用这两个变量时,变量内容为该函数的输入输出变量;如果声明中没有包含,但是在其上层的函数声明有包含,就当在该嵌套函数内部调用这两个变量的时候,变量内容是上层函数的输入输出变量,不知道现在的你有没有被绕晕

,来看程序再理一理吧。

程序:

代码语言:javascript
复制
function y=A(x,varargin)
B(nargin,x*rand(4))
    function B(argsIn,z)
        if argsIn>=2
            C(z,varargin{1},4.512,1.729)
        end
        function C(varargin)
            if nargin>=2
                y=varargin{1}
            end
        end
    end
end

结果:

分析:

函数A调用nargin即“B(nargin,x*rand(4))”,表示函数A的输入变量个数,函数C调用的nargin代表的就是函数C的输入变量个数;

在函数A中,函数C嵌套在B中,函数B嵌套在A中,函数B中调用varargin{1}表示的是主函数A传入的第二个变量,因为A的第一个变量是x,之后才是varargin,而在函数C中的varargin{1}表示的就是函数B传给C的第一个变量,即z,也就是A传给B的”x*rand(4)”。

坚持看到这篇文章的你,现在是否已经对这几篇分享的内容有很好的理解了呢?

没有就继续品吧……

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子狂人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档