Matlab special usage : @ and Struct

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来判断是否存在某一字段。

具体的实例如下:

时间: 2024-10-12 03:40:30

Matlab special usage : @ and Struct的相关文章

C/C++语法知识:typedef struct 用法详解

第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明. 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述. 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器

自然对齐:sizeof struct, union

[1]以下关于 JVM 的叙述,哪些项正确? A.JVM 运行于操作系统之上,它依赖于操作系统 B.JVM 运行于操作系统之上,它与操作系统无关 C.JVM 支持 Java 程序运行,它能够直接运行 Java 字节码文件 D.JVM 支持 Java 程序运行,它能够直接运行 Java 源代码文件 扩展名为.java的是源代码文件(文本文件):开发时编写代码的文件 扩展名为.class的是字节码文件(二进制):系统运行时执行的文件 [2]下列选项中正确的表达式是: A.byte b = 128; 

STL review:vector &amp; struct

I.vector 1.头文件:#include<vector>                        //容器vector是一个能实现随机存取.插入删除的动态数组,还可以当栈使. 2.创建: vector<int> v1:                             // < >里可以是struct或者vector嵌套:vector< vector<int> > ivec; vector是一个类模板,创建一个vector的过程

Matlab基本功能:自定义函数、添加块注释、定时器的试用

1.自定义函数 新建一个m文件 在m文件里面第一行输入function [X,Y]=pll(X1,Y1,X2,Y2),这里x1 x2 y1 y2是你函数的输入值, x y是输出值,接着定义你要实现的功能,比如:x = x1 + x2; y = y1 + y2; 接着保存这个m文件,注意!! 这个m文件的名字必须是定义的函数的名字,即保存为pll.m 否则会出错. 接着在matlab命令窗口中输入 pll(1,2,3,4)看看会得到什么? 也可以另外创建一个m文件,在这里调用pll()这个函数.

MATLAB循环结构:break+continue+嵌套

break语句:终止当前循环,继续执行循环语句的下一语句: continue语句:跳过循环体的后面语句,开始下一个循环: 例:求[100,200]之间第一个能被21整除的整数 for n=100:200 %循环语句 if rem(n,21)~=0 %选择语句 continue end break end n 程序输出结果为n= 105 循环的嵌套 若一个 数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数.求[1,500]之间的全部完数. for m=1:500 s=0;

MATLAB循环结构:while语句P69范数待编

while语句的一般格式为: while 条件 循环体语句 end 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们的和. 程序如下: sum=0; n=0; x=input('输入一个数字(end in 0):'); while x~=0 sum=sum+x; n=n+1; x=input('输入一个数字(end in 0):'); end if(n>0) sum mean=sum/n end 输出: 输入一个数字(end in 0):555656输入一个数字(end in 0)

Matlab技巧1:在同一坐标系上绘制两个函数图像

x=-2:0.01:2; y1=sqrt(2*abs(x)-x.^2); y2=asin(abs(x)-1)-pi/2; plot(x,y1,'r',x,y2,'b') grid 程序结果:

MATLAB循环结构:for语句+定积分实例

for语句 格式: 1 for 循环变量=表达式1:表达式2:表达式3 2 循环体语句 3 end 4 5 6 表达式1:循环变量初值:表达式2:步长:表达式3:循环变量终值. for 循环变量=矩阵表达式 循环体语句 end 循环变量分别等于矩阵各列元素,然后执行循环语句: s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];for k=a s=s+k;end disp(s'); %s'以行输出结果:39 48 57 66 disp(s)或s: 结果:394

Matlab非线性优化函数:fmincon();

%定义目标函数: function f = myfun(x) f = x(1)^2 + x(2)^2 + 8; end %非线性约束: function [c, ceq] = nonlia(x) c = -x(1)^2 + x(2); %不等式约束: ceq = -x(1) - x(2)^2 + 2; %等式约束: end %在命令窗口输入: A = []; b = []; Aeq=[]; beq=[]; lb = [0; 0]; ub = []; x0 = [0; 0]; [x,fval,ex