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. 烂泥:puppet添加带密码的用户

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 前一篇文章,我们介绍了有关puppet3.7的安装与配置,这篇文章我们再来介绍下如何利用puppet添加带密码的用户. 要通过puppet添加带密码的用 ...

  2. java学习之 反射

    以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习 ...

  3. VIM使用技巧总结

    一.vim使用的基本配置 1: set nu //设置行号 2: set ts=4 //设置tab为4个空格大小 3: set expandtab //设置用空格代替tab 4: set ai //设 ...

  4. ThinkPHP3.1.3源码分析---php文件压缩zlib.output_compression 和 ob_gzhandler

    问题来源:\ThinkPHP3.1.3_full\ThinkPHP\Lib\Core\App.class.php 中 init()方法      if(C('OUTPUT_ENCODE')){     ...

  5. android Java instanceof关键字

    instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boo ...

  6. linux centos使用xrdp远程界面登陆

    redhat6 安装xrdp 直接使用windows远程桌面连接登陆 下面介绍实现方法: 第一步:下载源码包,并安装一些依赖的软件下载xrdp源码包 ​wget http://downloads.so ...

  7. linux挂载windows上的共享文件夹

    假定win机d:/folder/share的共享名为 share , 有用户administrator ,密码123 在linux机上,把share挂到/mnt目录:mount -t cifs -o ...

  8. css3 background

    background是一个很重要的css属性,在css3中新增了很多内容.一方面是原有属性新增了属性值,另一方面就是新增了3个属性. 一.css3中新增属性值介绍 css2的background有5个 ...

  9. POJ 1556 The Doors【最短路+线段相交】

    思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...

  10. NOIP2009pj道路游戏[环形DP 转移优化 二维信息]

    题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有 n 个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依次将这 n 个机器人工厂编 ...