Background Knowledge
函数句柄:是包含了函数的路径、函数名、类型以及可能存在的重载方法。
函数句柄必须通过专门的定义创建的,而一般的图像的句柄是自动建立的。
(可理解为函数指针)
创建函数句柄使用@或者str2func命令创建
[[email protected]][email protected][/email]; h_fun=str2func('fun'); 比如说sin函数,[[email protected]][email protected][/email]; h_sin=str2func('sin'); 执行sin函数 feval feval('sin',pi/2) ans = 1
那么使用函数句柄有什么好处呢?
1、提高运行速度。因为matlab对函数的调用每次都是要搜索所有的路径,从set path中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
2、使用可以与变量一样方便。比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。因为你创建的function handles中,已经包含了路径,比如说我创建了一个fun
h_fun=str2func('rei'); 可以用functions来查看这个function,结果果然已经包括了路径。 functions(h_fun) ans = function: 'rei' type: 'simple' file: 'G:\program\serial232\rei.m'
Usage
@:
这个是matlab里边的匿名函数的标志。
匿名函数的标准格式是:
[email protected](arglist)express
(1)express是一个matlab变量表达式,比如:x+x.^2,sin(x)等
(2)argilst是参数列表;
(3)符号@是matlab创建函数句柄的操作符,表示创建有输入参数列表arglist和表达式express确定的函数句柄,并把这个函数句柄返回给变量fhandle,这样,以后就可以通过fhandle来调用定义好的函数了。
如:
1[email protected](x)acos(x)
表示f为函数句柄,@是定义句柄的运算符。
即 x是传入变量,f为调用函数,@(x)后为函数主体
[email protected](x)acos(x) 相当于建立了一个函数文件:
% f.m function y=f(x) y=acos(x);
若有下列语句:
2.[email protected](x)1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2);
则相当于建立了一个函数文件:
<span style="font-size:14px;">% xsqual.m function y=xsqual(x) y=1/2.*(x==-1/2)+1.*(x>-1/28&x<1/2)+1.2.*(x==-1/2);</span>
@:
是用于定义函数句柄的操作符。函数句柄既是一种变量,可以用于传参和赋值;也是可以当做函数名一样使用。
举例:
sin是matlab中的一个函数,但sin只是函数名,还不是函数句柄,不可以用于传参。
f = @sin;
这行代码定义了一个函数句柄,变量名是f。这样就可以当做参数传递了(这就是上面代码中的意义所在),而且还可以跟sin函数按相同的语法规则使用:
g = f; % g也是函数句柄,其“值”和f一样,都代表sin函数
y = g(pi); %可以得到y=0
有例子如下图:
另外有一种用法:
语法: 变量名[email protected](输入参数列表)运算表达式
这样产生的函数句柄变量不指向特定的函数, 而是一个函数表达式
例如:
详细说明:
1、函数句柄/function_handle(@):是一种间接调用函数的方式。
2、语法:[email protected] or [email protected](arglist)anonymous_function
3、描述:函数句柄(function handle)是一种能够提供函数间接调用的matlab value。你可以通过传递句柄来调用各种其他功能。你也可以将句柄存储到数据结构中备用(例如Handle Graphic 回调)。句柄是matlab的标准数据类型之一。
当创建句柄时,你所指定的函数必须在matlab搜索路径之中,并且必须在创建语句的scope之中。例如,只要在定义子函数的文件之中,你句可以为这个子函数创建句柄。这些条件不适用于evaluate函数句柄。例如,你可以在一个单独(out-scope)通过句柄执行一个子函数,这要求句柄是在in-scope创建的。
[email protected](arglist)anonymous_function用来创建匿名函数(anonymous function)并返回该匿名函数的句柄。括号右边的函数体是单个的matlab语句(statement)或者matlab命令。arglist是一个用逗号“,”分隔的输入变量列表。该函数通过句柄handle执行。
备注:函数句柄是标准的matlab数据类型。因此,你可以像matlab其他数据类型一样进行操作。
4、函数句柄的好处
①提高运行速度。因为matlab对函数的调用每次都是要搜索所有的路径,从set path中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
②使用可以与变量一样方便。比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。因为你创建的function handles中,已经包含了路径。
结构体的赋值:
结构体的赋值,这里不建议用下面这种形式进行统一赋值,
s = sturct(‘field1‘,values1,‘field2‘,values2,…)
而是建议直接赋值,就是对每一个属性进行单独赋值,因为每一个属性的长度不同,所以,直接赋值,就省去了声明的过程,方便,快捷;
例如我们要声明下面的结构体:
example.name=‘百度经验‘;
example.adress=‘北京‘;
example.age=‘18岁‘
直接输入以上语句便可。
结构体值的显示:
如果我们要查看结构体的所有值,那么可以直接输入结构体的名字,然后回车,就可以列出结构体的每项的名称和值,如果要显示某一个属性,通过单独调用,例如example.name,便会显示其名称。
结构体字段名称的获取以及判断:
假如我们想要知道这个结构体具体有多少字段(属性),我们可以通过函数fieldnames来获取字段名称,同时我们也可以通过函数isfield来判断是否存在某一字段。
具体的实例如下: