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

时间: 2024-10-10 21:27:49

MATLAB 嵌套函数,子函数,私有函数,重载函数的相关文章

匿名函数,子函数,私有函数,重载函数,eval和feval函数

匿名函数,子函数,私有函数等函数类型 匿名函数: 匿名函数没有函数名,也不是.m文件,只包含一个表达式和输入输出参数. [email protected](x,y)x.^y+3*x*y x,y为输入输入参数,Fxy为函数名 子函数: 在 Matlab中, 多个函数写入一个.m文件中.其中出现的第一个函数称为主函数,其他函数称为子函数,保存时文件名与主函数名相同,外部程序只能调用主函数. 特点: 子函数只能被同一文件下的其他函数调用 通过名称调用函数时优先调用子函数,再调用内置函数. 同一文件的主

C++:运算符重载函数之成员运算符重载函数

5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表) {       函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义. 在类的内部,声明成员运算符重载函数原型的格式如下: class X{      ...      函数类型 operator运算符(参数表); };

C++:运算符重载函数之友元运算符重载

5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算符重载函数的语法如下: 在类的内部: friend 函数类型 operator运算符(形参表) { 函数体 } 在类的内部声明,在类外定义: class X{ ... friend 函数类型 operator运算符(形参表): }; 函数类型 X::operator运算符(形参表) { 函数体 }

C++学习笔记(十二):重载函数

1. 什么是重载函数 假设同一作用域内的几个函数名字同样但形參列表不同.那么这些函数就称之为--重载函数. 比如: void print( const char *cp); void print(const int *begin , const int *end); void print(const int ia[], int size); 上面的这些构造函数运行的操作很的相似.都是打印一些数据.可是接受的形參却不一样. 当调用这些函数时,编译器会依据传递的实參类型判断想要运行的是哪个函数. 比

C++:友元运算符重载函数

运算符重载函数:实现对象之间进行算数运算,(实际上是对象的属性之间做运算),包括+(加号).-(减号).*./.=.++.--.-(负号).+(正号) 运算符重载函数分为:友元运算符重载函数.成员运算符重载函数 运算符运算符重载函数按运算类型为:双目运算符重载函数,如加.减.乘.除.赋值:   单目运算符重载函数:自加.自减.取正负号 切记:成员运算符. 和->,sezeof等不能重载.运算符重载函数的参数至少有一个是类类型或引用类型, 下面为友元运算符重载函数举例: 1 #include<i

通过函数名后加const重载的函数如何区分调用

参考网址:http://bbs.csdn.net/topics/391833689?page=1 在一般情况下默认调用不带const的函数. 想要调带const函数,解决办法: 1. 将调用发生的函数加const 2. 如果重载函数在某类内,将类实例(或this)做强制转换(const): const_cast<const A*>(this)->func();

C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)

转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 templ

C++类的成员函数(在类外定义成员函数、inline成员函数)

类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private(私有的).public (公用的)或protected(受保护的). 在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数).例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用.成员函数可以访问本类中任何成员(包括私有的和公用的),可

JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结

JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结 JAVA的思想真的很重要,所以要专心的学--献给刚入门的小程序员们 一.语句 一般语句也就三个类型 判断语句 if 选择语句 switch 循环语句 for 当然,还有其他的 我们这里一个一个来讲 1.if if,如果,就是判断,if(条件){} //公共的 类 类名 public class HelloJJAVA { // 公共的 静态 无