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 == 2A1= varargin{1};

A2= varargin{2};

B=A1+A2;elseA1= varargin{1};

A2= varargin{2};

A3=varargin{3};

B=A1*A2*A3;

end ;>> addd(1)

Errorusing addd (line 2)

Not enough input arguments.>> addd(1,2,3,4)

Errorusing addd (line 2)

Too many input arguments.>> addd(7,2,3)

ans=

42

varargin变量用法灵活,如 function add(var1,var2,varargin)

此时varargin存储的是var1和var2之后的变量

原文:http://www.cnblogs.com/MarshallL/p/4048846.html

matlab私有函数,MATLAB 嵌套函数,子函数,私有函数,重载函数相关推荐

  1. pq 中m函数判断嵌套_你还在用IF函数进行逻辑判断吗?试试PQ,简单又实用

    我们的身份证号码包含了很多信息,其中一个就是性别判断.我们之前分享过如何使用IF函数来进行判断,实质上IF函数还有嵌套两个简单的函数,分别是提取函数MID和取余函数MOD,这样三个函数一起未免有点让人 ...

  2. 【C语言】函数 ---- 函数的嵌套调用和链式访问、函数的声明和定义、变量的声明和定义、函数递归与迭代、递归时的栈溢出问题

    函数 一.函数的嵌套调用和链式访问 1.嵌套调用 2.链式访问 2.1strlen()函数 2.2printf()函数 二.函数的声明和定义 1.函数声明和定义的介绍 2.函数声明和定义的使用 三.变 ...

  3. android 如何重载函数,android - 如何在Frida中使用“ int”重载函数 - 堆栈内存溢出...

    我有以下功能: public final int getState(@NotNull String str, int i) { Intrinsics.checkParameterIsNotNull(s ...

  4. python 函数可以作为容器对象的元素_python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义...

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  5. Python基础第六天——函数的使用、函数的参数、函数的返回值、函数的嵌套、命名空间、作用域、函数对象...

    一.拾遗 1.通常情况下无参函数只是进行操作,所以不需要返回值:有参数函数则需要返回值. 2.练习: 判断用户输入一串字符,如果这串字符的长度小于5则重新输入,如果大于5则退出循环. while Tr ...

  6. vue函数如何调用其他函数?_C语言函数学习-函数的嵌套调用

    文章logo 函数的嵌套调用 C语言中不允许作嵌套的函数定义.因此各函数之间是平行的,不存在上一级函数和下一级函数的问题.但是C语言允许在一个函数的定义中出现对另一个函数的调用.这样就出现了函数的嵌套 ...

  7. C++:运算符重载与类的赋值运算符重载函数

    目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数:=重载函数(赋值运算符重载) 1.自定义= ...

  8. append函数_连载|想用Python做自动化测试?函数的参数传递机制及变量作用域

    " 这一节有点难.看不懂没关系.继续往后学,回头再来看." 10.6 函数参数传递的机制 10.6.1 值传递与引用传递 编程语言的参数传递机制通常有两种: 值传递 拷贝参数的值, ...

  9. 10.2 运算符重载函数作为类成员函数和友元函数

    Complex operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; ...

  10. C++入门之命名空间、缺省函数、重载函数及引用

    目录 一.命名空间 1.概念 (1)流插入运算符和流提取运算符 2.命名空间出现的意义 (1)c语言的命名缺陷 (2)如何解决命名冲突 3.命名空间的使用 (1)不展开使用 (2)完全展开使用 (3) ...

最新文章

  1. 2012-08-17
  2. error: Your local changes to the following files would be overwritten by merge
  3. Python中find函数的作用及用法
  4. 大剑无锋之HTTP连接、Tcp三次握手四次挥手、Tcp状态
  5. REST:使用Controller端点?
  6. mysql中in和exists的应用场景_mysql中关于in和exists的使用
  7. 一个多线程练习,为什么直接运行和debug结果不一样
  8. Java的注解和反射
  9. java经典项目_推荐几个经典的Java开源项目
  10. Python 蓝牙通信模块pybluez Win7
  11. 格物斯坦:机器人高手决战申城,IRM开启孩子新视界
  12. 关于使用实验室服务器的GPU以及跑上TensorFlow代码
  13. 2021年全国姓名报告出炉,你的姓与名上榜了吗?
  14. 数据库读写分离与分库分表
  15. error:type/value mismatch at ... ::iterator
  16. 在ecb里使用自定义快捷键切换窗口(emacs)
  17. mysql之聚簇索引与非聚簇索引
  18. 网上购车平台上私户,不一样的上私户购车体验
  19. calamari图片记录
  20. K8S Pod 保护之 PodDisruptionBudget

热门文章

  1. java spring 登录验证_详解使用Spring3 实现用户登录以及权限认证
  2. hadoop重命名文件_面试系列:深入理解hadoop架构体系
  3. BUUCTF-reverse3
  4. Python中必学知识点:类方法、实例方法和静态方法
  5. python中的apply(),applymap(),map() 的用法和区别
  6. Python中的defaultdict函数
  7. Python继承外另一种重用方式——组合
  8. python中的函数、生成器的工作原理
  9. python常用的日期时间模块
  10. python教程:__file__、__name__、__dict__三个方法的作用