Matlab系列之函数嵌套

前言

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

 

主函数

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

 

子函数

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

 

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

程序:

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文件调用。


嵌套函数

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

function x=A(p1,p2)

......

    function y=B(p3)

    ......

        function z=C(pN)

        ......

        end

    .......

    end

.......

end

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

function x=A(p1,p2)

......

    function y=B(p3)

        ...

    end

    function y=C(p4)

        ...

    end

    function y=N(pN)

        ...

    end

end

嵌套规则

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

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

程序:

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,则在函数内部调用这两个变量时,变量内容为该函数的输入输出变量;如果声明中没有包含,但是在其上层的函数声明有包含,就当在该嵌套函数内部调用这两个变量的时候,变量内容是上层函数的输入输出变量,不知道现在的你有没有被绕晕……,来看程序再理一理吧。

程序

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)”。



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



欢迎关注~

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab中,剔除数据的方法有多种。下面我将介绍两种常用的方法。 方法一是使用for循环遍历元胞数组并删除匹配数据。首先,定义一个包含数据的元胞数组`data`和要删除的数据的元胞数组`delete`。然后,使用两个for循环遍历元胞数组并删除匹配的数据。在代码中,我们从数组末尾开始循环,这样删除元素不会导致后续元素的索引变化。具体代码如下: ``` data = {'apple', 'banana', 'pear', 'orange', 'kiwi'}; delete = {'pear', 'kiwi'}; for i=length(data):-1:1 for j=1:length(delete) if strcmp(data{i}, delete{j}) data(i) = []; break; end end end ``` 请注意,这种方法需要使用两个嵌套的for循环,相对比较繁琐。 方法二是使用Matlab的in函数删除匹配数据。首先,定义一个包含数据的元胞数组`data`和要删除的数据的元胞数组`delete`。然后,使用Matlab的in函数`ismember`查找匹配的数据,并使用空括号`[]`删除这些数据。这种方法的代码比for循环方法更简洁。具体代码如下: ``` data = {'apple', 'banana', 'pear', 'orange', 'kiwi'}; delete = {'pear', 'kiwi'}; data(ismember(data, delete)) = []; ``` 此方法利用了`ismember`函数的功能,通过逻辑索引将匹配的数据删除。 除了以上两种方法,还可以使用Matlab中自带的`unique`函数来剔除重复的数据。通过`unique`函数的参数设置,可以选择保留第一个出现的数据或保留最后一个出现的数据。具体代码如下: ``` = unique(data, 'rows', 'stable'); ``` 其中,`data`是要剔除数据的数组,`'rows'`表示按行比较,`'stable'`表示保持数据在原始数组中的顺序。 另外,如果要剔除Excel文件中的重复行,可以使用`readtable`函数读取含有文本型数据的Excel文件,再使用`unique`函数剔除重复行。具体代码如下: ``` filename = '路径\example.xlsx'; % 输入文件路径和文件名 sheet = 'Sheet1'; % 输入表格名称 data = readtable(filename,'Sheet',sheet); = unique(data(:,5:11), 'rows'); result = data(unique(idx), :); ``` 以上就是在Matlab中剔除数据的几种方法,您可以根据具体的需求选择适合的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [删除Matlab中的元胞数组数据](https://blog.csdn.net/Jack_user/article/details/131278278)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MATLAB数据处理系列-重复数据的剔除](https://blog.csdn.net/xiatiandexia123/article/details/130140049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值