设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1408|回复: 0

matlab 函数定义调用以及函数句柄详解

[复制链接]

16

主题

90

金钱

153

积分

入门用户

发表于 2019-7-15 17:16:24 | 显示全部楼层 |阅读模式


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只能被主函数和主函数中的其他子函数调用。



3、Inline:无需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))



5、Syms+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




7、直接通过@符号定义.
示例如下:

>> f=@(x,y)(x.^2-sin(y))
f =
    @(x,y)(x.^2-sin(y))
>> f(2,3)
ans =


       3.8589

这个是matlab里边的匿名函数的标志。匿名函数的标准格式是:
fhandle=@(arglist)express
(1)express是一个matlab变量表达式,比如:x+x.^2,sin(x)等
(2)argilst是参数列表;
(3)符号@是matlab创建函数句柄的操作符,表示创建有输入参数列表arglist和表达式express确定的函数句柄,并把这个函数句柄返回给变量fhandle,这样,以后就可以通过fhandle来调用定义好的函数了。
如:
myfun=@(x)(x+x.^2)

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

觉得自己很少用函数句柄,但是经常遇到,所以在这里总结一下。
函数句柄:是包含了函数的路径、函数名、类型以及可能存在的重载方法。
函数句柄必须通过专门的定义创建的,而一般的图像的句柄是自动建立的。

创建函数句柄使用@或者str2func命令创建
[email=h_fun=@fun]h_fun=@fun[/email];
h_fun=str2func('fun');
比如说sin函数,[email=h_sin=@sin]h_sin=@sin[/email];   h_sin=str2func('sin');

执行sin函数     feval
feval_r('sin',pi/2)
ans =
     1
那么使用函数句柄有什么好处呢?
1、提高运行速度。因为matlab对函数的调用每次都是要搜索所有的路径,从set path中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
2、使用可以与变量一样方便。比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。因为你创建的function handles中,已经包含了路径,比如说我创建了一个fun
h_fun=str2func('rei');
可以用functions来查看这个function,结果果然已经包括了路径。

——————————————————————————————————————————————————————————————————————

Matlab中的匿名函数的使用

在Matlab7.0以后的版本中,出现了一种新的函数类型–匿名函数,不但能够完成原来版本中内联函数(inline)的功能,还提供了其他更方便的功能。Matlab首席科学家Moler教授都推荐用匿名函数替代原来的内联函数。我最近学习了一些有关匿名函数的内容,现在总结一下:

1,匿名函数的基本用法。

handle = @(arglist)anonymous_function

其中handle为调用匿名函数时使用的名字。arglist为匿名函数的输入参数,可以是一个,也可以是多个,用逗号分隔。anonymous_function为匿名函数的表达式。举个例子如下:

>> f=@(x,y)x^2+y^2;


>> f(1,2) ans =      5

当然输入的是数组也是可以的:

>> f=@(x,y)x.^2+y.^2; %注意需要点(.)运算 >> a=1:1:10; >> b=10:-1:1; >> f(a,b) ans =    101    85    73    65    61    61    65    73    85   101

匿名函数的表达式中也可以有参数的传递,比如:

>> a=1:5;


>> b=5:-1:1;


>> c=0.1:0.1:0.5;


>> f=@(x,y)x.^2+y.^2+c;


>> f(a,b) ans =    26.1000   20.2000   18.3000   20.4000   26.5000

c作为表达式中的参数,进行了数据传递。上面都是单重匿名函数,也可以构造多重匿名函数,如:

>> f=@(x,y)@(a) x^2+y^+a;


>> f1=f(2,3) f1 =     @(a)x^2+y^+a


>> f2=f1(4) f2 =     85

每个@后的参数从它后面开始起作用,一直到表达式的最后。

2.使用匿名函数实现符号函数的赋值运算

在老版本的Matlab中,这个功能是由inline函数完成的,现在用匿名函数完成此功能。比如:知道z=2x^3+4x+5,求z在x=3处的2阶导数值。可以先用符号函数算出z的2阶导数的表达式,然后通过匿名函数,把x赋予3的值,得到最后结果:

>> syms x; %定义符号变量


>> z=2*x^3+4*x+5; %定义表达式


>> z1=diff(z,2) %求z的2阶导数的表达式 z1 = 12*x


>> z2=eval_r(['@(x)' vectorize(z1)]); %vectorize函数的功能是使内联函    %数适合数组运算的法则


>> z2(3) ans =     36



functions(h_fun)
ans =
    function: 'rei'
        type: 'simple'
        file: 'G:\program\serial232\rei.m'​​​​
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表