您的位置:首页 > 编程语言 > MATLAB

Matlab中函数定义方法

2016-05-04 00:29 387 查看

Matlab自定义函数的六种方法

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

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

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

n4、匿名函数;

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

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

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

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

%调用函数文件:myfile.m

clear

clc

fort=1:10

y=mylfg(t);

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

end

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

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

Y=x^(1/3);

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

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

%命令文件:funtry2.m

function[]=funtry2()

fort=1:10

y=lfg2(t)

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

End

functiony=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);

functionr=mysubfun1(x,n)%子函数1

x1=sort(x);

r=x1(n);

functionr=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’;

Symsxg;

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调用:

Symsfx%定义符号

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

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

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

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

Symsfx

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.嵌套定义

functionmainFunc()

...

a=myfunc1();

...

functionmyfunc1()

...

end

end

2.非嵌套定义

functionmainFunc()

...

a=myfunc1();

...

end

functionmyfunc1()

...

end

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

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

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

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

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

例子:

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

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

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

%子函数举例

max1=find_max(1,2,3)

max2=find_max(7,3,9)

functionmax=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文件。

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

%functionson_function()

会出现下面的错误

Functiondefinitionsarenotpermittedatthepromptorinscripts.

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

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

endalsomarkstheterminationofanM-filefunction,althoughinmostcases,itisoptional.endstatementsarerequiredonlyinM-filesthatemployoneormorenestedfunctions.WithinsuchanM-file,everyfunction(includingprimary,nested,private,andsubfunctions)mustbeterminatedwithanendstatement.Youcanterminateanyfunctiontypewithend,butdoingsoisnotrequiredunlesstheM-filecontainsanestedfunction

尽管大多数情况下,end在function的用法是可选的,但也可以用它标记一个M文件函数的结束。end语句仅在使用一个或多个嵌套函数的情况下才是要求的。在诸如此类嵌套函数的M-文件中,每一个函数(包括主调函数,嵌套函数,私有函数和子函数)必须以一个end语句来结束。可以使用end结束任一函数类型,但这样做除了M-文件包含一个嵌套函数其他情况并非必要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: