Matlabfunnction函数定义及常见扩展应⽤(@函数句柄,feval
函数等)
⽬录
MATLAB函数定义:
1、函数⽂件+调⽤命令⽂件:需单独定义⼀个⾃定义函数的M⽂件;
2、函数⽂件+⼦函数:定义⼀个具有多个⾃定义函数的M⽂件;
3、Inline:⽆需M⽂件,直接定义;
4、匿名函数;
5、+subs: ⽆需M⽂件,直接定义;
6、字符串+subs:⽆需M⽂件,直接定义;
7、直接通过@符号定义.
1、函数⽂件+调⽤函数⽂件:定义多个M⽂件:
% 调⽤函数⽂件:myfile.m
clc
clear
for i=1:10
y=myfun(i);
end
%⾃定义函数⽂件: myfun.m  %注意:函数名(myfun)必须与⽂件名(myfun.m)⼀致
function y=myfun(x)
Y=x^(1/3);
end
注:这种⽅法要求⾃定义函数必须单独写⼀个M⽂件,不能与调⽤的命令⽂件写在同⼀个M⽂件中。
2、函数⽂件+⼦函数:定义⼀个具有多个⼦函数的M⽂件
%命令⽂件:myfun1.m
function []=myfun1()
for t=1:10
y=fun(t)
fprintf(‘M^(1/3)=%6.4f\n’);
end
function y=fun(x)
Y= x^(1/3);
end
注:⾃定义函数⽂件myfun.m中可以定义多个⼦函数function。⼦函数fun只能被主函数和主函数中的其他⼦函数调⽤。
3、Inline:⽆需M⽂件,直接定义;
%inline命令⽤来定义⼀个内联函数:f=inline(‘函数表达式’, ‘变量1’,’变量2’,……)。
调⽤⽅式:y=f(数值列表) %注意:代⼊的数值列表顺序应与inline()定义的变量名顺序⼀致。
%For example
f=inline(‘x^2+y’,’x’,’y’);
z=f(2,3)
->ans=7
注:这种函数定义⽅式是将它作为⼀个内部函数调⽤。特点是,它是基于的数值运算内核的,所以它的运算速度较快,程序效率更⾼。缺点是,该⽅法只能对数值进⾏代⼊,不⽀持符号代⼊,且对定义后的函数不能进⾏求导等符号运算。
4. 匿名函数
使⽤matlab函数句柄操作符@,可以定义指向matlab内置函数和⽤户⾃定义函数的函数句柄,函数句柄也可以像函数⼀样的使⽤。handle = @(arglist)anonymous_function
其中handle为调⽤匿名函数时使⽤的名字。arglist为匿名函数的输⼊参数,可以是⼀个,也可以是多个,⽤逗号分隔。
anonymous_function为匿名函数的表达式。举个例⼦如下:
%MATLAB内置函数
x=-pi:0.1:pi;
f=@sin;
plot(f);
%⽤户⾃定义函数
>> f=@(x,y)x^2+y^2;
>> f(1,2)
ans =  5
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+y^2)
->f(1,2)
->ans=5
Matlab feval函数⽤法
语法
[y1,y2,...] = feval(fhandle,x1,x2,...,xn)
[y1,y2,...] = feval(fname,x1,x2,...,xn)
描述
第⼀种⽤法中的fhandle是⼀个函数的handle,x1,x2,…xn是该函数的参数,函数的handle怎么写,看下⾯的例⼦
第⼆中⽤法中的fname是⼀个字符串表⽰的函数名称。注意,该名称必须是简单名称,也即不能包含路径,也不能含有.m扩展名。x1,x2,…xn是该函数参数
例⼦
在当前⽬录下新建⼀个M函数
function [y1,y2] = swap(x1, x2)
y1 = x2;
y2 = x1;
第⼀种⽤法:
[a1,a2] = feval(@swap, 1,2)
第⼆种⽤法
matlab求导[a1,a2] = feval('swap',a1,a2)
不只是⾃定义的M函数可以这样⽤,内置函数也可以这样⽤,⽐如下⾯两种⽤法就是等价的
[V,D] = eig(A)
[V,D] = feval(@eig, A)
还有⼀种情况要特别注意:
当⼀个函数需要调⽤另⼀个函数作为参数时,这时要注意该函数作为参数传递时要⽤字符符号的形式调⽤,如:
%swap函数
function [y1,y2] = swap(x1, x2)
y1 = x2;
y2 = x1;
end
%BFGS算法函数
[x,val,k]=bfgs('swap','fun','gfun',x0) %swap,fun ,gfun都是函数,x0为参数
注意:
Q:第⼀种⽤法中,使⽤feval函数和直接调⽤swap函数有什么区别呢
A:这是⼀种回调函数的⽤法,在⼀些设计模式中⾮常常见。 应⽤场景: 假如有许多个版本的swap函数实现swap1, swap2, swap3, swap4。具体调⽤哪个函数需要根据某种条件进⾏判断,如果不使⽤feval,那么在每个调⽤swap的地⽅都要做判断。使⽤feval,你就可以把判断调⽤哪个函数放在⼀处地⽅,其他真正调⽤的都是使⽤feval。