Matlab自定义函数的六种方法

n1、函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件;

n2、函数文件+子函数:定义一个具有多个自定义函数的M文件;

n3、Inline:无需M文件,直接定义;

n4、匿名函数;

n5、Syms+subs:无需M文件,直接定义;

n6、字符串+subs:无需M文件,直接定义。

------------

1、函数文件+调用函数文件:定义多个M文件

% 调用函数文件:myfile.m

clear

clc

for t=1:10

y=mylfg(t);

fprintf(‘M^(1/3)=%6.4f\n’,t,y);

end

%自定义函数文件: mylfg.m

function y=mylfg(x) %注意:函数名(mylfg)必须与文件名(mylfg.m)一致

Y=x^(1/3);

注:这种方法要求自定义函数必须单独写一个M文件,不能与调用的命令文件写在同一个M文件中。

2、函数文件+子函数:定义一个具有多个子函数的M文件

%命令文件:funtry2.m

function []=funtry2()

for t=1:10

y=lfg2(t)

fprintf(‘M^(1/3)=%6.4f\n’);

End

function y=lfg2(x)

Y= x^(1/3);

%注:自定义函数文件funtry2.m中可以定义多个子函数function。子函数lfg2只能被主函数和主函数中的其他子函数调用。

注意:函数定义格式
在matlab中应该做成M文件,文件名要和你文件里的function后面的函数名一致,在File新建一个M-file 在M-file里编辑函数,其格式为:
 
function [输出实参表]=函数名(输入实参数)
     注释部分
      函数体语句
      return语句(可以有可以没有)
如果是文件中的子函数,则可以任意取名,也可以在同一个文件中定义多个子函数:
  例: function [max,min]=mymainfun(x)      %主函数
                n=length(x);
      max=mysubfun1(x,n); 
       min=mysubfun2(x);
      function r=mysubfun1(x,n)            %子函数1
               x1=sort(x);
                r=x1(n);
     function r=mysubfun2(x)              %子函数2
               x1=sort(x);
                r=x1(1);

详细见后文:matlab中同一文件定义子函数的方法

【说明】可以将一个主函数和多个子函数写在一个m文件中,文件名是主函数名,第一个函数是主函数,后面跟的函数都是这个函数中需要调用的子函数或者子子函数。即该文件必须是以function打头的函数文件,不能是前面不是函数,后面跟一串函数。强调一下,前面是命令后面加函数是不行的,必须前面也是函数!前面无参数输入的而是一段命令,直接将这些命令定义为一个无参数的函数就可以了。

3Inline:无需M文件,直接定义

%inline命令用来定义一个内联函数:f=inline(‘函数表达式’, ‘变量1’,’变量2’,……)。

调用方式:y=f(数值列表) %注意:代入的数值列表顺序应与inline()定义的变量名顺序一致。

例如:

f=inline(‘x^2+y’,’x’,’y’);

z=f(2,3)

Ans=7

注:这种函数定义方式是将它作为一个内部函数调用。特点是,它是基于Matlab的数值运算内核的,所以它的运算速度较快,程序效率更高。缺点是,该方法只能对数值进行代入,不支持符号代入,且对定义后的函数不能进行求导等符号运算。

例:

Clear

Clc

f=’x^2’;

Syms x g;

g=x^2;

h=inline(‘x^2’,’x’);

4. 匿名函数

使用matlab函数句柄操作符@,可以定义指向matlab内置函数和用户自定义函数的函数句柄,函数句柄也可以像函数一样的使用。例如:

>>x=-pi:0.1:pi;

>> fh={@cos,@sin};

fh =

@cos    @sin

>>plot(fh{2}(x))

5Syms+subs: 无需M文件,直接定义

用syms定义一个符号表达式,用subs调用:

Syms f x %定义符号

f=1/(1+x^2); %定义符号表达式

subs(f, ‘x’,代替x的数值或符号)

注:对于在syms中已经定义过的符号变量,在subs中进行替代时,单引号可以省略。但是,如果在syms后又被重新定义为其他类型,则必须加单引号,否则不可替换。

这种函数定义方法的特点是,可以用符号进行替换

Syms f x

f=1/(1+x^2);

subs(f, ‘x’,’y^2’)

ans=

1/(1+(y^2)^2)

注:该方法的缺点是,由于使用符号运算内核,运算速度会大大降低。

6、字符串+subs:无需M文件,直接定义

直接定义一个字符串,用subs命令调用。例如:

f=’1/(1+x^2)’ %定义字符串

z=subs(f,’x’,2)

g=subs(f,’x’,’y^2’)

注:优点是,占用内存最少,定义格式方面自由。

缺点是,无法对字符进行符号转化。

当所要替代的符号在调用前都已经有了数值定义,则可以直接调用:subs(f).例如:

f=’x^2*y’;

x=2;y=3;

subs(f)

ans=12

-------------------------------------------

详细:Matlab中同一文件定义子函数的方法

有时子函数可能很短,就几行,可能希望将多个函数定义放在同一个.m文件中,这里就存在一个子函数的定义问题。

matlab中一个.m文件中可以有多个的子函数,但仅能有一个主函数,并且M文件名必须和主函数相同

在一个m文件中通常有两种定义子函数的方法:

1.嵌套定义

function mainFunc()

...

a = myfunc1();

...

function myfunc1()

...

end

end

2. 非嵌套定义

function mainFunc()

...

a = myfunc1();

...

end

function myfunc1()

...

end

在第二种情况中,myfunc1和主函数就是两个独立的函数,和把它们写在两个独立的文件

中没有差别。变量名想怎么起怎么起,不会有任何冲突。

而第一种情况中,myfunc1会和主函数共享变量名。这种情况下,使用相同的变量名,如

果不是故意为之,就不合适了。

对于嵌套函数,函数定义中的end必不可少。

 

例子:

下面是某个.m脚本文件(son_function.m文件)中的内容:

% %-----------------------------------------------------------------------

function son_function( )        %主函数必须位于最上方

%子函数举例

max1=find_max(1,2,3)

max2=find_max(7,3,9)

function max=find_max(a,b,c)    %子函数

if (a>=b)&(a>=c)

max=a;

elseif (b>=a)&(b>=c)

max=b;

else

max=c;

end

% %-----------------------------------------------------------------------

注意:

M文件中将函数的调用直接写到m脚本文件中的情况是不允许的,必须也把调用写成函数的形式,或者将子函数都写成单独的m文件。

如将上程序中的第一行屏蔽掉,即

% function son_function( )

会出现下面的错误

Function definitions are not permitted at the prompt or in scripts.

---------------------------------

下面一段文字是摘自matlab帮助中的一段文字:end在function中的使用

end also marks the termination of an M-file function, although in most cases, it is optional. end statements are required only in M-files that employ one or more nested functions. Within such an M-file, every function (including primary, nested, private, and subfunctions) must be terminated with an end statement. You can terminate any function type with end, but doing so is not required unless the M-file contains a nested function

尽管大多数情况下,end在function的用法是可选的,但也可以用它标记一个M文件函数的结束。end语句仅在使用一个或多个嵌套函数的情况下才是要求的。在诸如此类嵌套函数的M-文件中,每一个函数(包括主调函数,嵌套函数,私有函数和子函数)必须以一个end语句来结束。可以使用end结束任一函数类型,但这样做除了M-文件包含一个嵌套函数其他情况并非必要的。

Matlab中函数定义方法的更多相关文章

  1. matlab中struct创建方法

    MATLAB中struct创建方法可分为:直接创建法和struct()函数创建法 (1)直接创建: 直接定义字段,像使用一般matlab变量一样,不需要事先声明,支持动态扩充.下面创建一个Studen ...

  2. matlab中函数fscanf

    matlab中函数fscanf matlab中函数fscanf在文件读取方面的实例如下: 从文件中有格式地读数据 fscanf 语法1:[a,count]=fscanf(fid,format,size ...

  3. JavaScript 函数定义方法

    JavaScript 函数定义方法. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function functionName(parameters) { 执行的代码 } 函数声明后不会立 ...

  4. Go - 反射中 函数 和 方法 的调用 - v.Call()

    上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的. 反射中调用 函数 众所周知,Golang 中的 ...

  5. Javscript调用iframe框架页面中函数的方法

    Javscript调用iframe框架页面中函数的方法,可以实现iframe之间传值或修改值了, 访问iframe里面的函数: window.frames['CallCenter_iframe'].h ...

  6. js 立即执行函数定义方法

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  7. matlab中plot使用方法

    MATLAB有非常强的图形功能,能够方便地实现数据的视觉化.强大的计算功能与图形功能相结合为MATLAB在科学技术和教学方面的应用提供了更加广阔的天地.以下着重介绍二维图形的画法,对三维图形仅仅作简单 ...

  8. php中函数和方法的区别

    php的方法就是定义在类里面的方法,一般不建议在方法内部定义方法,但是这种也可以这种叫做内部方法,一般只能本方法调用. 如果定义在同一个类中的方法,在同类的其他方法中调用是$this->方法名就 ...

  9. Matlab中函数句柄@的作用及介绍

    问:f=@(x)acos(x)表示什么意思?其中@代表什么?答:表示f为函数句柄,@是定义句柄的运算符.f=@(x)acos(x) 相当于建立了一个函数文件:% f.mfunction  y=f(x) ...

随机推荐

  1. 无法连接到WMI提供程序 三种解决办法

    无法连接到WMI 提供程序 请注意,你只能使用SQL Server 配置管理器来管理SQL Server 2005服务器.找不到指定的模块.[0x8007007e] 解决方案1: 检查一下 windo ...

  2. windows下使用mysql双机热备功能

    一. 准备工作 1. 准备两台服务器(电脑),接入局域网中,使互相ping得通对方 2. 两台服务器都安装mysql-server-5.1,必须保证mysql的版本一致 3. 假设,服务器A:192. ...

  3. 烂泥:apache虚拟主机的学习与应用

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 要配置apache的虚拟主机,我们需要分以下几步进行: 1. 检查apache虚拟主机模块 2. 开启apache虚拟主机功能 3. httpd-vho ...

  4. Linux IPC System V 消息队列

    模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> ftok() //获取key ...

  5. android ProgressDialog 正在载...Loading...

    final ProgressDialog pd = new ProgressDialog(mContext); pd.setMessage("正在加载..."); pd.show( ...

  6. Debian deb源方法升级PHP软件包

    学习Linxu以来,一直坚持编译方式安装软件包,貌似圈子里面也是都倾向于编译,可是搜索到的编译方法都是一堆复制粘贴来的指令, 每个人都这么编译, 却几乎没有人去写明那些五花八门的编译指令代表了什么,是 ...

  7. STM32之USART库函数USART_SendData的bug

    转载自:http://www.cnblogs.com/itloverhpu/p/3250537.html 1.最近在调试ATM32F103CB时发现,一串数据的最后一个字节总是发送不出去,用的是RS4 ...

  8. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

  9. BZOJ1864[ZJOI2006]三色二叉树[树形DP]

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 773  Solved: 548[Submit][Status] ...

  10. Codeforces Round #371 (Div. 2) C. Sonya and Queries[Map|二进制]

    C. Sonya and Queries time limit per test 1 second memory limit per test 256 megabytes input standard ...