码迷,mamicode.com
首页 > 其他好文 > 详细

Matlab special usage : @ and Struct

时间:2016-05-03 18:40:34      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

Background Knowledge

函数句柄:是包含了函数的路径、函数名、类型以及可能存在的重载方法。
函数句柄必须通过专门的定义创建的,而一般的图像的句柄是自动建立的。
可理解为函数指针
创建函数句柄使用@或者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('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里边的匿名函数的标志。

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


1.f=@(x)acos(x)

表示f为函数句柄,@是定义句柄的运算符。
即 x是传入变量,f为调用函数,@(x)后为函数主体

f=@(x)acos(x) 相当于建立了一个函数文件

% f.m
function  y=f(x)
y=acos(x);

若有下列语句:

2.xsqual=@(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
有例子如下图:
技术分享

另外有一种用法:
语法:   变量名=@(输入参数列表)运算表达式
这样产生的函数句柄变量不指向特定的函数, 而是一个函数表达式
例如:
技术分享

技术分享


详细说明:

1、函数句柄/function_handle(@):是一种间接调用函数的方式。
2、语法:
handle=@functionname  or handle=@(arglist)anonymous_function
3、描述:函数句柄(function handle)是一种能够提供函数间接调用的matlab value。你可以通过传递句柄来调用各种其他功能。你也可以将句柄存储到数据结构中备用(例如Handle Graphic 回调)。句柄是matlab的标准数据类型之一。
      当创建句柄时,你所指定的函数必须在matlab搜索路径之中,并且必须在创建语句的scope之中。例如,只要在定义子函数的文件之中,你句可以为这个子函数创建句柄。这些条件不适用于evaluate函数句柄。例如,你可以在一个单独(out-scope)通过句柄执行一个子函数,这要求句柄是在in-scope创建的。
       handle=@(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来判断是否存在某一字段。

具体的实例如下:

技术分享


Matlab special usage : @ and Struct

标签:

原文地址:http://blog.csdn.net/u011534057/article/details/51297494

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!