0. 函数句柄(函数的“指针”)
定义:一种可储存函数关系式的matlab数据类型
作用:(1)将一个函数传递给另一个函数,许多matlab函数接受将函数句柄用作输入,例如将函数关系式传递给fsolve函数进行求解
(2)构造匿名函数(内联方式定义而非存储在程序文件中的函数)
使用isa(h,'function_handle')来查看变量h是否是函数句柄。
创建函数句柄方法:
f = @myfunction;
为名为myfunction的函数创建函数句柄f。
与函数句柄相关的函数
(1)feval计算函数
[y1,...,yN] = feval(fun,x1,...,xM)
fun:函数名称或函数句柄
x1,...,xM:输入参数
a = feval(@sin,pi/2) %函数句柄使用方法
% a = 1
b = feval('sin', pi/2) % 函数名使用方法
% b = 1
(2)matlabFuntion函数
功能:将符号表达式转化为函数句柄(匿名函数)和子函数(得到的是向量化的函数形式)
(1)g = matlabFunction(f)
f:符号表达式或符号函数
g:转换得到的函数句柄
(2)g = matlabFunction(f1,...,fN)
(3) g = matlabFunction(_,Name, Value)
输入参数'Vars'可定义输出函数句柄中变量的形式
输入参数'File'+'myfile'输出以'myfile'为名的子函数文件
syms x y
syms f(x,y)
f = x^2 + y^2; % 符号表达式
f(x,y) = x^2 + y^2; % 符号函数
g1 = matlabFunction(f)
g2 = matlabFunction(f(x,y))
syms x y z t
r = (x + y/2 + z/3)*exp(-t);
% 以t+向量[x y z]为输入参数的形式输出函数句柄
g3 = matlabFunction(r,'Vars', {t, [x y z]})
g4 = matlabFunction(r,'File','Myfunc','Vars',{t,[x y z]})
生成的Myfunc代码为:
function r = Myfunc(t,in2)
%MYFUNC
% R = MYFUNC(T,IN2)
% This function was generated by the Symbolic Math Toolbox version 8.7.
% 04-Jan-2022 15:26:25
x = in2(:,1);
y = in2(:,2);
z = in2(:,3);
r = exp(-t).*(x+y./2.0+z./3.0);
(3)str2func函数
功能:将字符串转化为函数句柄
fh = str2func(str)
str:函数名或匿名函数的字符表达式
fh:函数句柄或匿名函数句柄
fh1 = str2func('cos')
fh1(0)
c = '@(x)x.^2';
fh2 = str2func(c)
fh2(1:3)
(4)func2str函数
功能:将函数句柄转化为字符向量
c = func2str(f)
f:函数句柄或匿名函数句柄
c:字符向量和匿名函数字符向量
f = @(x,y)x^2+y^2;
c = func2str(f);
disp(['函数',c,'在原点的值为:', num2str(f(0,0))]);
函数@(x,y)x^2+y^2在原点的值为:0
1. 匿名函数
1.1 定义
基于单行表达式的MATLAB函数,不需要程序文件
语法:
h = @(arglist)anonymous_function;
创建了以anonymous_function为主体arglist为参数列表的匿名函数。
1.2 匿名函数的种类
按照自变量的个数及层数分为:单变量匿名函数、多变量匿名函数、单重匿名函数和多重匿名函数。
1.2.1 单重匿名函数
f = @(x)x.^2 +2;
f(1:3)
% ans = 3 6 11
含参数(参数已知)的单变量匿名函数
a = 10; b = 30;
f = @(x)a*x+b;
f(2)
% ans = 50
当参数a,b将值传递给匿名函数后,在匿名函数中的值不会因为a,b值的变化再改变,当a,b重新赋值时,需要重新构造匿名函数进行计算
a = 30; b = 10;
f(2)
% ans = 50
f1 = @(x)a*x+b;
f1(2)
% ans = 70
1.2.2 多变量匿名函数
g = @(x,y)x.^2+y.^2;
g(3,4)
% ans = 25
1.2.3 单重匿名函数
上述两种匿名函数均属于单重匿名函数,只有一个“@”符号引导具体的函数表达式。多重匿名函数在参数传递方面非常方便。在应用篇中将会详细讲解。
1.2.4 多重匿名函数
f = @(a,b)@(x)a*x+b
% f =
% @(a,b)@(x)a*x+b
其中,“a,b”是外层变量,“x”是内层变量。每个@符号后面括号里的变量的作用域一直到表达式的结尾。
2. 嵌套函数
2.1 定义
nested function,即嵌套在函数体内部的函数。嵌套函数可以出现在函数体内部的任何位置,开始以function声明,以end结束。
parent;
function parent
disp('This is the parent function')
nestedfx
function nestedfx
disp('This is the neseted function')
end
end
程序输出:
This is the parent function
This is the neseted function
2.2 嵌套函数的变量作用域
主函数和嵌套在其内的函数,它们各自的变量是可以相互访问的:(1)嵌套函数可以自由访问主函数的变量,但主函数访问嵌套函数内的变量必须经过调用之后才能用。(2)主函数内彼此没有嵌套关系的嵌套函数间无法自由共享变量,只能通过主函数进行共享。