第七章 M 文件和函数句柄
7.1
M 文本编辑器 7.2
MATLAB 控制流 7.2.1 for 循环结构
【例7.2-1】一个简单的for 循环示例。
for ii=1:10;
x(ii)=ii;
end;
x
x =
1 2 3 4 5 6 7 8 9 10
7.2.2 while 循环结构
【例7.2-2】Fibonacci 数组的元素满足Fibonacci 规则:12+++=k k k a a a ,),2,1( =k ;且121==a a 。现要求该数组中第一个大于10000的元素。
a(1)=1;a(2)=1;i=2;
while a(i)<=10000
a(i+1)=a(i-1)+a(i);
i=i+1;
end;
i,a(i),
i =
21
ans =
10946
7.2.3 if-else-end 分支结构
【例7.2-3】一个简单的分支结构。
cost=10;number=12;
if number>8
sums=number*0.95*cost;
end,sums
sums =
114.0000
【例7.2-4】用for 循环指令来寻求Fibonacc 数组中第一个大于10000的元素。 n=100;a=ones(1,n);
for i=3:n
a(i)=a(i-1)+a(i-2);
if a(i)>=10000
a(i),
break;
end;
end,i
ans =
10946
i =
21
7.2.4switch-case结构
【例7.2-5】学生的成绩管理,用来演示switch结构的应用。
clear;
for i=1:10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];
Name={' Jack','Marry','Peter',' Rose',' Tom'};
Mark={72,83,56,94,100};Rank=cell(1,5);
S=struct('Name',Name,'Marks',Mark,'Rank',Rank);
for i=1:5
switch S(i).Marks
case 100
S(i).Rank='满分';
case a
S(i).Rank=' 优秀';
case b
S(i).Rank=' 良好';
case c
S(i).Rank=' 及格';
otherwise
S(i).Rank='不及格';
end
end
disp(['学生姓名 ',' 得分 ',' 等级']);disp(' ')
for i=1:5;
disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]); end;
学生姓名得分等级
Jack 72 及格
Marry 83 良好
Peter 56 不及格
Rose 94 优秀
Tom 100 满分
7.2.5try-catch结构
【例7.2-6】try-catch结构应用实例。
clear,N=4;A=magic(3);
try
A_N=A(N,:),
catch
A_end=A(end,:),
end
lasterr
A_end =
4 9 2
ans =
Index exceeds matrix dimensions.
7.2.6控制程序流的其它常用指令
7.3脚本文件和函数文件
7.3.1M脚本文件
7.3.2M函数文件
7.3.3局部变量和全局变量
7.3.4M文件的一般结构
【例7.3-1】M函数文件示例。
[circle.m]
function sa = circle(r,s)
%CIRCLE plot a circle of radii r in the line specified by s. % r 指定半径的数值
% s 指定线色的字符串
% sa 圆面积
%
% circle(r) 利用蓝实线画半径为 r 的圆周线.
% circle(r,s) 利用串 s 指定的线色画半径为 r 的圆周线.
% sa=circle(r) 计算圆面积,并画半径为 r 的蓝色圆面.
% sa=circle(r,s) 计算圆面积,并画半径为 r 的 s 色圆面.
% 编写于1999年4月7日,修改于1999年8月27日。
if nargin>2
error('输入宗量太多。');
end;
if nargin==1
s='b';
end;
clf;
t=0:pi/100:2*pi;
x=r*exp(i*t);
if nargout==0
plot(x,s);
else
sa=pi*r*r;
fill(real(x),imag(x),s)
end
axis('square')
7.3.5P码文件
一语法分析过程和伪代码
二P码文件的预生成
三内存中P码文件的列表和清除
7.3.6MATLAB的搜索过程
7.4变量的检测传递和限权使用函数
7.4.1输入输出宗量检测指令
7.4.2跨空间变量传递
一跨空间计算串表达式的值
【例7.4-1】evalin运行机理与eval的异同。
(1)编写M函数文件
[evalinzzy.m]
function y1=evalinzzy(a,s)
t=(0:a)/a*2*pi;
y1=subevalinzzy(4,s);
%------------ subfunction -------------
function y2=subevalinzzy(a,s)
t=(0:a)/a*2*pi;ss='a*exp(i*t)';
switch s
case {'base','caller'}
y2=evalin(s,ss);
case 'self'
y2=eval(ss);
end
(2)在Notebook或MATLAB指令窗中运行以下指令
clear,a=30;t=(0:a)/a*2*pi;sss={'base','caller','self'};
for k=1:3
y0=evalinzzy(8,sss{k});
subplot(1,3,k)
plot(real(y0),imag(y0),'r','LineWidth',3),axis square image end
图
二跨空间赋值
【例7.4-2】assignin运作机理示范。
(1)编写M函数文件
[assigninxyq.m]
function y=assigninxyq(x)
y=sqrt(x);t=x^2;
assignin('base','yy',t)
(2)在Notebbok 或MATLAB指令窗中运行以下指令
clear;x=4;y=assigninxyq(x);
disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy']),disp([x,y,yy]) x y yy
4 2 16
7.4.3子函数和私用函数
一子函数
二私用函数
7.5串演算函数
7.5.1eval
【例7.5-1】计算“语句”串,创建变量。
clear,t=pi;eval('theta=t/2,y=sin(theta)');
theta =
1.5708
y =
1
【例7.5-2】计算“合成”串。
CEM={'cos','sin','tan'};
for k=1:3
theta=pi*k/12;
y(1,k)=eval([CEM{k},'(',num2str(theta),')']);
end
y
y =
0.9659 0.5000 1.0000
7.5.2feval
【例7.5-3】对字符串类型函数只能用eval ,而不能用feval。
x=pi/4;Ve=eval('1+sin(x)')
Ve =
1.7071
Vf=feval('1+sin(x)',x)
??? Error using ==> feval
Invalid function name '1+sin(x)'.
【例7.5-4】函数句柄只能被feval 运用,而不能被eval 调用。
(1)
rand('seed',1);A=rand(2,2);
Heig=@eig;
d=feval(Heig,A)
d =
0.7568
-0.1488
(2)
de=eval(Heig,A)
??? Error using ==> eval
Function 'eval' not defined for variables of class 'function_handle'.
(3)
dn=feval('eig', A)
dn =
0.7568
-0.1488
7.5.3 内联函数
【例7.5-5】用内联函数对象实现y ae y x a G x cos ),,( 。
G=inline('a*exp(x)*cos(y)','a','x','y');
disp([class(G),blanks(10),char(G)])
argnames(G)
inline a*exp(x)*cos(y)
ans =
'a'
'x'
'y'
GG=vectorize(G)
GG =
Inline function:
GG(a,x,y) = a.*exp(x).*cos(y)
GG(2,[1,2],[pi/3,pi])
ans =
2.7183 -14.7781
【例7.5-6】演示:最简练格式创建内联函数;内联函数可被feval 指令调用。
Z2=inline('P1*x*sin(x^2+P2)',2)
Z2 =
Inline function:
Z2(x,P1,P2) = P1*x*sin(x^2+P2)
z2=Z2(2,2,3)
fz2=feval(Z2,2,2,3)
z2 =
2.6279
fz2 =
2.6279
7.6
函数句柄 7.6.1 函数句柄的创建和观察
【例7.6-1】为MATLAB 的“内建”函数创建函数句柄,并观察其内涵。
(1)
hsin=@sin;
(2)
class(hsin)
size(hsin)
ans =
function_handle
ans =
1 1
(3)
CC=functions(hsin)
CC =
function: 'sin'
type: 'overloaded'
file: 'MATLAB built-in function'
methods: [1x1 struct]
(4)
CC.methods
ans =
sym: 'd:\matlabr12\toolbox\symbolic\@sym\sin'
7.6.2函数句柄的基本用法
【例7.6-2】本例通过sin函数及其句柄演示若干基本用法。
(1)
fhandle=str2func('sin');
(2)
ys=sin(pi/4)
yfold=feval('sin',pi/4)
yfnew=feval(fhandle,pi/4)
ys =
0.7071
yfold =
0.7071
yfnew =
0.7071
(3)
Alpha=sym('pi/4');
yss=sin(Alpha)
yfold=feval('sin',Alpha)
ynews=feval(fhandle,Alpha)
yss =
1/2*2^(1/2)
yfold =
1/2*2^(1/2)
ynews =
1/2*2^(1/2)
(4)
xold=fminbnd('sin',0,2*pi)
xnew=fminbnd(fhandle,0,2*pi)
xold =
4.7124
xnew =
4.7124
【例7.6-3】自建函数及其句柄的使用。通过本例可看到:只要在当前MATLAB工作空间中存
在函数句柄,那末不管该函数当前是否在搜索范围内,均可通过函数句柄实现正确的运作。(1)
[zzy076_3.m]
function Hr=zzy076_3(flag )
% ZZY076_3 为演示函数、子函数句柄而设计的绘图文件。
% flag 可以取字符串'line'或 'circle'。
t=(0:100)/100*2*pi;
x=sin(t);
y=cos(t);
Hr=@cirline; %创建子函数的句柄
feval(Hr,flag,x,y,t)
% -------------subfunction---------------------------
function cirline(wd,x,y,t)
% wd 接受字符串'line'或'circle'
% t 画线用的独立参变量
% x 由t产生的横坐标变量
% y 由t产生的纵坐标变量
switch wd
case 'line'
plot(t,x,'b' ,t,y,'r','LineWidth',2)
case 'circle'
plot(x,y,'g.','MarkerSize',30),
axis square off
otherwise
error('输入宗量只能取 ''line'' 或 ''circle'' ! ')
end
shg
(2)
Hzzy076_3=@zzy076_3
zzy076_3('line');
Hzzy076_3 =
(3)
which('zzy076_3')
zzy076_3 not found.
(4)
zzy076_3('line')
feval('zzy076_3','line')
??? Undefined function or variable 'zzy076_3'.
(6)
【例7.6-4】子函数句柄的创建与使用。本例仍然使用上例中的zzy076_3.m文件。通过本例可以看到:原先只能在“父函数”视野(Scope)内被调用的子函数,借助其句柄,可扩大使用范围。即,只要MATLAB工作空间中有子函数的句柄,它就能被正确调用,不管该子函数是否在当前视野内,也不管该子函数的父函数是否在搜索路径上。
(1)
HCL=zzy076_3('circle')
HCL =
@cirline
图 7.6_2 zzy076_3.m绘制的圆
(2)
tt=(0:100)/100*2*pi;
xx=sin(tt);
yy=cos(tt);
cirline('circle',xx,yy,tt);
feval('circle',xx,yy,tt)
??? Undefined function or variable 'cirline'.
(3)
feval(HCL,'circle',xx,yy,tt)
习题7
函数及其表示练习题 一.选择题 1 函数)2 3 (,32)(-≠+= x x cx x f 满足,)]([x x f f =则常数c 等于( ) A 3 B 3- C 33-或 D 35-或 2. 已知)0(1)]([,21)(2 2 ≠-=-=x x x x g f x x g ,那么)21(f 等于( ) A 15 B 1 C 3 D 30 3. 函数2y =的值域是( ) A [2,2]- B [1,2] C [0,2] D [ 4 已知2 211()11x x f x x --=++,则()f x 的解析式为( ) A 21x x + B 2 12x x +- C 212x x + D 2 1x x +- 5.设()f x 是R 上的任意函数,则下列叙述正确的是 ( ) (A)()()f x f x -是奇函数 (B)()()f x f x -是奇函数 (C) ()()f x f x --是偶函数 (D) ()()f x f x +-是偶函数 6. 下列图中,画在同一坐标系中,函数bx ax y +=2与)0,0(≠≠+=b a b ax y 函数的图象只可能是 ( ) 7.已知二次函数)0()(2 >++=a a x x x f ,若0)( A .正数 B .负数 C .0 D .符号与a 有关 8. 已知)(x f 的定义域为)2,1[-,则|)(|x f 的定义域为 ( ) A .)2,1[- B .]1,1[- C .)2,2(- D .)2,2[- 9. 已知在x 克%a 的盐水中,加入y 克%b 的盐水,浓度变为%c ,将y 表示成x 的函数 关系式 ( ) A .x b c a c y --= B .x c b a c y --= C .x a c b c y --= D .x a c c b y --= 10.已知f 满足f (ab )=f (a )+ f (b),且f (2)=p ,q f =)3(那么)72(f 等于 ( ) A .q p + B .q p 23+ C .q p 32+ D .23q p + 11. 某学校要招开学生代表大会,规定各班每10人推选一名代表,当各班人数除以10的余数大于..6.时再增选一名代表.那么,各班可推选代表人数y 与该班人数x 之间的函数关系用取整函数y =[x ]([x ]表示不大于x 的最大整数)可以表示为 (A )y =[ 10 x ] (B )y =[ 3 10x +] (C )y =[410x +] (D )y =[5 10 x +] 12.已知函数()()2113,f x x x =+≤≤则 A .()()12202f x x x -=+≤≤ B .()()12124f x x x -=-+≤≤ C .()()12202f x x x -=-≤≤ D .()()12104f x x x -=-≤≤ 13.函数 ln 1x y += 的定义域为 A .4,1-- B .()4,1- C .()1,1- D .(1,1]- 14.设函数()221, 1,2, 1, x x f x x x x ?-≤? =?+->??则 ()12f f ?? ? ??? 的值为 A . 1516 B .2716- C .8 9 D.18 15. 定义在R 上的函数()f x 满足 ()()()()()2,,12f x y f x f y xy x y R f +=++∈= 则()3f -等于( ) A. 2 B. 3 C. 6 D . 9 16.下列函数中与函数y = 有相同定义域的是 ( ) A .()ln f x x = B 。 ()1f x x = C 。 ()f x x = D 。 ()x f x e = AfxGetMainWnd AfxGetMainWnd获取自身窗口句柄 HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow 函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。 函数原型:HWND GetTopWindow(HWND hWnd); 参数: hWnd:被查序的父窗口的句柄。如果该参数为NULL,函数返回Z序顶部的窗口句柄。返回值: 如果函数成功,返回值为在Z序顶部的子窗口句柄。如果指定的窗口无子窗口,返回值为NULL。 GetForegroundWindow 函数功能:该函数返回当前系统的前台窗口的窗口句柄。 函数原型:HWND GetForegroundWindow(VOID) 返回值:函数返回前台窗回的句柄。 GetActiveWindow 函数功能:该函数可以获得与调用该方法的线程的消息队列相关的活动窗口的窗口句柄(就是取得当前进程的活动窗口的窗口句柄)。 函数原型:HWND GetActiveWindow(VOID) 返回值:返回值是与调用线程的消息队列相关的活动窗口的句柄。否则,返回值为NULL。 GetSafeHwnd 函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数。 通过下面的例子来看其理由: CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器 HWND hwnd = pwnd->m_hwnd; //得到它的HWND 这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器 HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND 就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL IsWindowVisible 函数功能:该函数获得给定窗口的可视状态。 函数原型:BOOL IsWindowVisible(HWND hWnd); 参数; hWnd:被测试窗口的句柄。 返回值: M文件与M函数 Matlab输入命令的常用方式有两种:一种是直接在Matlab的命令窗门中逐条输入Matlab 命令;二是m文件工作方式。当命令行很简单时,使用逐条输入方式还是比较方便的。但当命令行很多时(比如说几十行乃至全成百上千行命令),显然再使用这种方式输入MATLAB 命令,就会显得杂乱无章,不易于把握程序的具体走向,并且给程序的修改和维护带来了很大的麻烦。这时,建议采用Matlab命令的第二种输入形式m文件工作方式。 m文件工作方式,指的是将要执行的命令全部写在一个文本文件中,这样既能使程序显得简洁明了,又便于对程序的修改与维护。m文件直接采用Matlab命令编写,就像在Matlab 的命令窗口直接输入命令一样,因此调试起来也十分方便,并且增强了程序的交互性。 m文件与其他文本文件一样,可以在任何文本编辑器中进打编辑、存储、修改和读取。利用m文件还可以根据白己的需要编写一些函数,这些函数也可以橡Matlab提供的函数一样进行调用。从某种意义上说,这也是对MATLAB的二次开发。 m文件有两种形式:一种是命令方式或称脚本方式;另一种就是函数文件形式。两种形式的文件扩展名均是.m。 1、M文件 当遇到输入命令较多以及要重复输入命令的情况时,利用命令文件就显得很方便了。将所有要执行的命令按顺序放到一个扩展名为.m的文本文件中,每次运行时只需在MATLAB 的命令窗口输入m文件的文件名就可以了。需要注意的是,m文件最好直接放在Matlab的默认搜索路径下(一般是Matlab安装目录的子目录work中),这样就不用设置m文件的路径了,否则应当用路径操作指令path重新设置路径。另外,m文件名不应该与Matlab的内置函数名以及工具箱中的函数重名,以免发生执行错误命令的现象。Matlab对命令文件的执行等价于从命令窗口中顺序执行文件中的所有指令。命令文件可以访问Matlab工作空间里的任何变量及数据。命令文件运行过程中产生的所有变量都等价于从Matlab工作空间中创建这些变量。因此,任何其他命令文件和函数都可以自由地访问这些变量。这些变量一旦产生就一直保存在内存中,只有对它们重新赋值,它们的原有值才会变化。关机后,这里变量也就全部消失了。另外,在命令窗口中运行clear命令,也可以把这些变量从工作空间中删去。当然,在Matlab的工作空间窗口中也可以用鼠标选择想要删除的变量,从而将这些变量从工作空间中删除。 接下来,编写一个名为test.m的命令文件,用来计算矩阵1到100的和,并把它放到变量s中。 第一步创建新的M-文件。在Matlab主菜单上选择菜单命令File→New→M-File matlab 匿名函数函数句柄 (2012-05-11 11:35:05) 转载▼ 分类:study与matlab 标签: 教育 一、函数句柄 所谓函数句柄,个人认为可以将其理解成一个函数的代号,就像一个人的名字。这样在调用时可以调用函数句柄而不用调用该函数。 语法如下: 变量名= @ 函数名; @的作用就是将一个函数的函数句柄赋值给等号左边的变量。在调用函数时就可以调用该句柄,可以实现同样的功能。 例: 首先我们写一个求均值的函数: function y=average(x) y=mymean(x); function a=mymean(v) a=sum(v)/length(v); 定义一个数组z: z=[1,2,3,4,5,6,7]; >> average(z) ans = 4 >> handle=@average handle = @average >> ave=@average ave = @average >> ave(z) ans = 4 二、匿名函数相当于C语言中的函数指针(入口地址),只不过句柄就用一个唯一的常整数来指出 匿名函数是函数句柄的一种特殊用法,这里所得到的函数句柄变量不指向特定的函数(即不指向函数M文件中的函数名),而是指向一个函数表达式(具体表达式)。 语法如下: 变量名=@(输入参数列表)运算表达式; 例子: 为了说明问题,我们用简单的两个数相加, >> sum=@(x,y)x+y sum = @(x,y)x+y >> sum(2,3) ans = 5 %%%%%%%%%%%%%%%%%%% 比如定义f(x)=x^2,可以写为 f=@(x)(x.^2) 其中@(x)(x.^2)就是匿名函数,第一个括号里面是自变量,第二个括号里面是表达式,@是函数指针 f=@(x)(x.^2)表示将匿名函数@(x)(x.^2)赋值给f,于是f就表示该函数。 于是f(2)=2.^2=4;f(1:3)=[1:3].^2=[1 4 9]等等 定义匿名函数时也可以调用别的匿名函数,比如 f1=@(x,y)(x.^2+y.^2) 定义了函数x^2+y^2 f2=@(t)(f1(t,2)) 定义了函数t^2+4 f3=@(x)(f1(x(1),x(2))) 定义了函数x(1)^2+x(2)^2 使用匿名函数时一定要注意函数本身的参数形式,如 f1(2,3) 表示2^2+3^2 f2(3)=3 表示3^2+4 f3([1,2]) 表示1^2+2^2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 三、内联函数 内联函数和普通的函数句柄,准确说跟匿名函数比较类似,可以通过一个函数表达式近而得到该函数。 语法格式如下: 1 变量名=inline(表达式); 2 变量名=inline('函数表达式', '变量名1','变量名2', ... ,'变量名n');(推荐) 例如: 高一数学必修1 函数及其表示练习题 1、判断下列对应:f A B →是否是从集合A到集合B的函数: (1){} ,0,:,:;A R B x R x f x x f A B ==∈>→→ (2)*,,:1,:.A N B N f x x f A B ==→-→ (3){} 2 0,,:,:.A x R x B R f x x f A B =∈>=→→ 2、已知函数()()()3,10, ,85,10,x x f x x N f f f x x -≥??=∈=? +????? 其中则 ( ) A.2 B.4 C.6 D.7 3、已知,则()(){} 2,0,,0,30,0.x x f x x f f f x π?>? ==-?????? 那么的值等于 ( ) A.0 B.π C.2 x D.9 4、已知函数()11x f x x +=-的定义域为A,函数()y f f x =????的定义域为B,则 ( ) A.A B B = B.A B 豣 C.A B = D.A B B = 5、已知函数()()()5 3 8,210,2f x x ax bx f f =+++-=且那么等于 ( ) A.-18 B.6 C.-10 D.10 6、若()y f x =的定义域是[]0,2,则函数()()121f x f x ++-的定义域是 ( ) A.[]1,1- B.1,12?? ???? C.13,22 ?????? D.10,2 ?????? 7、函数1y x x =++的值域为_____________________. 8、已知()f x 是一次函数,且满足()()3121217,f x f x x +--=+求()f x . 9、设函数()f x 的定义域为R,且对,,x y R ∈恒有()()(),f xy f x f y =+若( )83,f f ==则 ( ) 在用符号(symbolic) 运算得到一个符号表达式后,我们可能需要令其进一步参与数值运算。然而,很多数值运算函数,比如数值积分函数(quad,quadgk,integral),都只能接受函数句柄作为输入。于是,将符号表达式转化为函数句柄就成了必然。 如果不怕麻烦,完全可以通过手动输入对应的符号表达式来建立函数句柄。然而,很多情况下我们得出的符号表达式可能极其复杂,甚至可能占据很多行。此时,手动输入显然相当不便。于是,找到一种自动将符号表达式转化为函数句柄的方法就显得尤为重要。下面列举出三种自动转换的办法(三种办法得到的函数都是匿名函数): 1. 最简便的办法:利用matlabFunction(这个函数只适用于2009a及更新的版本) 1.syms x 2.y=exp(x)*x^2+x+1 3.g = matlabFunction(y) 复制代码 如果你的matlab报错,这说明你的版本太老,那么请使用下面两种办法。 2. eval + vectorize 函数:vectorize 的目的是将字符串(string)表达式里的* / ^ 替换为 .* ./ .^ ,以支持向量运算。eval 执行该字符串后得到函数句柄 1.syms x 2.y=exp(x)*x^2+x+1 3.g = eval(['@(x)',vectorize(y)]) 复制代码 这个方法需要借助eval 函数,在论坛里已经被广大坛友广泛使用过。 3. str2func + vectorize 函数:str2func 函数可以直接将字符串转化为函数句柄 1.syms x 2.y=exp(x)*x^2+x+1 3.g = str2func(['@(x)',vectorize(y)]) 复制代码 实验五M文件和MATLAB程序设计 一、实验目的 matlab作为一种高级计算机语言,不仅可以命令行方式完成操作,也具有数据结构、控制流、输入输出等能力,本次实验通过熟悉和掌握m文件的建立与使用方法,以及函数与控制程序流程语句的使用,使学生具备一定的编程和程序调试能力。 1.掌握M文件的使用方法。 2.掌握if语句和switch语句的使用 3. 掌握循环语句的使用 4. 通过练习理解MATLAB编程方法。 二、实验原理 1.m文件 用matlab语言编写的程序,称为m文件。M文件根据调用方式的不同分为两类,命令文件(Script file)和函数文件(Function file)。区别? 2.程序控制结构 1)顺序结构 2)选择结构 (1)if语句a) 单分支if语句b) 双分支if语句c) 多分支if语句 (2)switch 语句 (3)try语句 3)循环结构 (1)for 语句 (2)while语句 (3)break语句、continue语句、return使用,区别? 3.函数文件 function 输出形参表=函数名(输入形参表) 注释说明部分 函数体语句 注意事项? 三、实验要求 1.首先上机练习PPT中各种流程控制语句的有关实例。 2.然后上机练习下面的实验习题。 四、实验习题 1.数论中一个有趣的题目:任意一个正整数,若为偶数,则用2除之,若为奇数,则与3相乘再加上1。重复此过程,最终得到的结果为1。如: 2→1 3→10→5→16→8→4→2→1 6→3→10→5→16→8→4→2→1 运行下面的程序,按程序提示输入n=1,2,3,5,7,8,9等数来验证这一结论。 %classic "3n+1" problem from number theory. while 1 n=input('Enter n,negative quits:'); if n<=0 break end a=n; while n>1 if rem(n,2)==0 n=n/2; else n=3*n+1; end a=[a,n]; end a end Enter n,negative quits: 2. 编程求满足∑=>m i i 11000020的最小m 值。 a=0; i=1; while (a<100000) a=a+pow2(i); i=i+1; end m=i-1 3. 编写一个函数,计算下面函数的值,给出x 的值,调用该函数后,返回y 的值。 function [y]=myfun1(x) 1.2 函数及其表示 一、 选择题 1、函数()y f x =的图象与直线x m =的交点个数为( ) A .可能无数个 B .只有一个 C .至多一个 D .至少一个 2、设{}{} M=22,02x x N y y -≤≤=≤≤,函数()f x 的定义域为M ,值域为N ,则 ()f x 的图象可以是( ) 3、函数()x f x x =+ 的图象是如图中的( ) A . B . C . D . 4、已知()f x 是一次函数且()()()()()22315,2011,f f f f f x -=--==则( ) A .32x + B .32x - C .23x + D .23x - 5、设函数()()221,1 1,22,1x x f x f f x x x ???-≤=???+->??? 则的值为( ) A . 15 16 B .2716 - C . 89 D .18 6、一个面积为2 100cm 的等腰梯形,上底长为x cm ,下底长为上底长的3倍,则把它 的高y 表示成x 的函数为( ) A .()500y x x => B .()1000y x x => C .()50 0y x x = > D .()100 0y x x = > 7、函数( )1 3 f x x = -的定义域为( ) A .[)(]22+∞-∞- ,, B .[)()2,33+∞ , C .[)()(]2,332+∞-∞- ,, D .(]2-∞-, 8、设()() ()()1,0,00,0x x f x x x π+>?? ==?? ,则(){} 1f f f -????的值是( ) A .1π+ B .0 C .π D .1- 二、填空题 9、已知函数()()f x g x 、分别由下表给出: 则()1f g ????的值为____________,当()2g f x =????时,x =_______________。 10、已知) ()11,f x f x =-=则_____________。 11、已知区间[]2,35a a -+,则a 的取值范围是_____________。 12、函数()f x =的定义域为________________。 三、解答题 13、若函数()()[]2 23,,y f x x a x x a b ==+++∈的图象关于直线1x =对称,求b 的 值。 WIN32进程快照以及进程ID和句柄查找收藏 要对进程进行某种操作,就必须首先知道该进程的进程句柄或者进程ID,否则一切无从谈起,对于程序自己创建的子进程来说,CreateProcess函数返回了进程句柄和进程ID,但如果需要调试系统中已经运行的进程,那就必须首先获取它们的句柄才行。Win32中并没有直接获取其他进程句柄的函数,但如果知道进程ID,可以由此得到进程句柄,所以可以首先通过某种途径获取进程ID。 一、获取进程ID 1. 从窗口句柄获取进程句柄 获取进程ID的方法之一是使用GetWindowThreadProcessId函数,这个函数可以从一个窗口句柄获得创建该窗口的进程的进程ID,而通过FindWindow函数得到窗口句柄是很简单的,所以GetWindowThreadProcessId函数的用途相当广泛。该函数的用法是: DWORD GetWindowThreadProcessId( HWND hWnd, // handle to window LPDWORD lpdwProcessId // process identifier ); 其中hWnd参数指定需要用来获取进程ID的窗口句柄,lpdwProcessId指向一个双字变量,函数在这里返回创建窗口的进程ID,函数的返回值是目标进程中创建该窗口的线程的线程句柄(一个有用的副产品!)。 2. 通过快照来获取进程ID 每一个应用程序实例在运行起来后都会在当前系统下产生一个进程,大多数应用程序均拥有可视界面,用户可以通过标题栏上的关闭按钮关闭程序。但是也有为数不少的在后台运行的程序是没有可视界面的,对于这类应用程序用户只能通过CTRL+ALT+DEL热键呼出"关闭程序"对话框显示出当前系统进程列表,从中可以结束指定的任务。显然,该功能在一些系统监控类软件中还是非常必需的,其处理过程大致可以分为两步:借助系统快照实现对系统当前进程的枚举和根据枚举结果对进程进行管理。本文下面即将对此过程的实现进行介绍。 当前进程的枚举 要对当前系统所有已开启的进程进行枚举,就必须首先获得那些加载到内存的进程当前相关状态信息。在Windows操作系统下,这些进程的当前状态信息不能直接从进程本身获取,系统已为所有保存在系统内存中的进程、线程以及模块等的当前状态的信息制作了一个只读副本--系统快照,用户可以通过对系统快照的访问完成对进程当前状态的检测。在具体实现时,系统快照句柄的获取是通过Win32 API函数CreateToolhelp32Snapshot()来完成的, 1.2函数及其表示练习题 一.选择题 1 函数)2 3 (,32)(-≠+= x x cx x f 满足,)]([x x f f =则常数c 等于( ) A 3 B 3- C 33-或 D 35-或 2. 已知)0(1)]([,21)(2 2 ≠-=-=x x x x g f x x g ,那么)21(f 等于( ) A 15 B 1 C 3 D 30 3. 函数2y =的值域是( ) A [2,2]- B [1,2] C [0,2] D [] 4 已知2 211()11x x f x x --=++,则()f x 的解析式为( ) A 21x x + B 2 12x x +- C 212x x + D 2 1x x +- 5.设()f x 是R 上的任意函数,则下列叙述正确的是 ( ) (A)()()f x f x -是奇函数 (B)()()f x f x -是奇函数 (C) ()()f x f x --是偶函数 (D) ()()f x f x +-是偶函数 6. 下列图中,画在同一坐标系中,函数bx ax y +=2与)0,0(≠≠+=b a b ax y 函数的图象只可能是 ( ) 7.已知二次函数)0()(2 >++=a a x x x f ,若0)( A .正数 B .负数 C .0 D .符号与a 有关 8. 已知)(x f 的定义域为)2,1[-,则|)(|x f 的定义域为 ( ) A .)2,1[- B .]1,1[- C .)2,2(- D .)2,2[- 9. 已知在x 克%a 的盐水中,加入y 克%b 的盐水,浓度变为%c ,将y 表示成x 的函数关系式 ( ) A .x b c a c y --= B .x c b a c y --= C .x a c b c y --= D .x a c c b y --= 10.已知f 满足f (ab )=f (a )+ f (b),且f (2)=p ,q f =)3(那么)72(f 等于 ( ) A .q p + B .q p 23+ C .q p 32+ D .23q p + 11. (2010陕西文数)某学校要招开学生代表大会,规定各班每10人推选一名代表,当各班人数除以10的余数大于..6.时再增选一名代表.那么,各班可推选代表人数y 与该班人数x 之间的函数关系用取整函数y =[x ]([x ]表示不大于x 的最大整数)可以表示为 (A )y =[ 10x ] (B )y =[ 3 10x +] (C )y =[4 10 x +] (D )y =[5 10 x +] 12.(2009海口模拟)已知函数()()2113,f x x x =+≤≤则 A .()()12202f x x x -=+≤≤ B .()()12124f x x x -=-+≤≤ C .()()12202f x x x -=-≤≤ D .()()12104f x x x -=-≤≤ 13.(2009江西理)函数 ln 1x y += 的定义域为 A .()4,1-- B .4,1- C .()1,1- D .(1,1]- 14.(2008山东)设函数()2 21, 1, 2, 1,x x f x x x x ?-≤?=?+->??则 ()12f f ?? ? ??? 的值为 A . 1516 B .2716- C .8 9 D.18 15.(2008陕西) 定义在R 上的函数()f x 满足 ()()()()()2,,12f x y f x f y xy x y R f +=++∈= 则()3f -等于( ) A. 2 B. 3 C. 6 D .9 16.( 2009福建)下列函数中与函数y = 有相同定义域的是 ( ) A .()ln f x x = B 。 ()1f x x = C 。 ()f x x = D 。 ()x f x e = matlab图形句柄属性 句柄式图形常用函数: (1)get(h)返回句柄值h所指定的图形对象的所有属性名称与相对应的属性值 (2)a = get(h)返回由句柄值h所指定的图形对象的属性结构数组,并且该数组的字段名称就是该对象的属性名称。 (3)a = get(0,'factory')返回所有能由用户设置的属性的默认定义值。 (4)a = get(0,'FactoryObjectTypePropertyName1','FactoryObjectTypePropertyName2',...) 返回指定对象类型指定的属性值,输入参数FactoryObjectTypePropertyName为一个关键词,由字符Factory与图形对象类型(如Figure)还有属性名称(如Color)组成。 a = get(0,'factoryFigureColor')返回Figure对象的Color属性值。 (5)a = get(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName1',...) 返回句柄值为h的对象指定属性的默认值。如“DefaultFigureColor”。 (6)a = get(h,'default')列出h对象的所有属性的默认属性值 (7)a = set(h)返回句柄值h所指定的图形对象的所有属性名称对应的可设置属性值,a为结构数组,存储对象的属性名称,其字段值为相对应的属性值。属性值中用{}括起来的表示默认值。 (8)set(h,a)使用指定的属性值来设置由句柄值h所指定的对象属性,a为结构数组,其字段名称为对象的属性名称,字段值为相对应的属性值。 (9)a = set(0,'factory')返回那些用户可以设置默认值的所有对象的属性,同时显示可设置的属性值。 (10)a=set(0,'FactoryObjectTypePropertyName')返回所有对象中指定的属性名称FactoryObjectTypePropertyName的所有可能的属性值。 (11)a = set(h,'属性名','属性值')设置句柄值为h的对象的与属性名对应的属性值。(12)set(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName2',...) 对句柄值为h的对象设置特定属性名称的属性默认值。 (13)H = findobj;返回Root对象与其所有子对象的句柄值 (14)H = findobj(h);返回h变量的句柄值 (15)H = findobj(’属性名称‘,’属性值‘);依据对象的属性名称和属性值找出匹配的对象句柄值。 (16)H = findobj(ObjectHandles,’属性名称‘,’属性值‘);根据限定的对象列表找出与对象的属性名称和属性值匹配的对象句柄值 (17)gcf返回当前Figure对象的句柄值 gca返回当前axes对象的句柄值 gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab 会把当前图形对象的句柄值存放在Figure的CurrentObject属性中。 Figure 对象是指屏幕(root对象)中产生的窗口,并且MATLAB允许用Figure 函数建立任意数目的窗口,但所有的绘图函数,如plot surf等,如果窗口未存在时,会自动建立一个新的窗口;每个窗口则构成一个Figure 对象。 函数及其表示 (一)知识梳理 1.映射的概念 设B A 、是两个非空集合,如果按照某种对应法则f ,对A 中的任意一个元素x ,在集合B 中都有唯一确定的元素y 与之对应,则称f 是集合A 到集合B 的映射,记作f(x). 2.函数的概念 (1)函数的定义: 设B A 、是两个非空的数集,如果按照某种对应法则f ,对A 中的 任意数 x ,在集合B 中都有 唯一确定 的数y 和它对应,则这样的对应关系叫做从A 到B 的一个函数,通常记为___y=f(x),x ∈A (2)函数的定义域、值域 在函数A x x f y ∈=),(中,x 叫做自变量,x 的取值范围A 叫做函数的定义域;与x 的值相对应的y 值叫做函数值, 对于的函数值的集合所有的集合构成 值域。 (3)函数的三要素: 定义域 、 值域 和 对应法则 3.函数的三种表示法:图象法、列表法、解析法 (1).图象法:就是用函数图象表示两个变量之间的关系; (2).列表法:就是列出表格来表示两个变量的函数关系; (3).解析法:就是把两个变量的函数关系,用等式来表示。 4.分段函数 在自变量的不同变化范围中,对应法则用不同式子来表示的函数称为分段函数。 (二)考点分析 考点1:判断两函数是否为同一个函数 如果两个函数的定义域相同,并且对应关系完全一致,称这两个函数相等。 考点2:求函数解析式 方法总结:(1)若已知函数的类型(如一次函数、二次函数),则用待定系数法; (2)若已知复合函数)]([x g f 的解析式,则可用换元法或配凑法; (3)若已知抽象函数的表达式,则常用解方程组消参的方法求出)(x f 一、选择题 1. 判断下列各组中的两个函数是同一函数的为( C ) ⑴3 )5)(3(1+-+=x x x y ,52-=x y ;⑵111-+=x x y ,)1)(1(2-+=x x y ; ⑶x x f =)(,2)(x x g =;⑷()f x ()F x = ⑸21)52()(-=x x f ,52)(2-=x x f . A. ⑴、⑵ B. ⑵、⑶ C. ⑷ D. ⑶、⑸ 句柄式图形常用函数: (1)get(h)返回句柄值h所指定的图形对象的所有属性名称与相对应的属性值 (2)a = get(h)返回由句柄值h所指定的图形对象的属性结构数组,并且该数组的字段名称就是该对象的属性名称。 (3)a = get(0,'factory')返回所有能由用户设置的属性的默认定义值。 (4)a = get(0,'FactoryObjectTypePropertyName1', 'FactoryObjectTypePropertyName2',...)返回指定对象类型指定的属性值,输入参数FactoryObjectTypePropertyName为一个关键词,由字符Factory与图形对象类型(如Figure)还有属性名称(如Color)组成。 a = get(0,'factoryFigureColor')返回Figure对象的Color属性值。 (5)a = get(h,'DefaultObjectTypePropertyName1', 'DefaultObjectTypePropertyName1',...) 返回句柄值为h的对象指定属性的默认值。如“DefaultFigureColor”。 (6)a = get(h,'default')列出h对象的所有属性的默认属性值 (7)a = set(h)返回句柄值h所指定的图形对象的所有属性名称对应的可设置属性值,a为结构数组,存储对象的属性名称,其字段值为相对应的属性值。属性值中用{}括起来的表示默认值。 (8)set(h,a)使用指定的属性值来设置由句柄值h所指定的对象属性,a为结构数组,其字段名称为对象的属性名称,字段值为相对应的属性值。 (9)a = set(0,'factory')返回那些用户可以设置默认值的所有对象的属性,同时显示可设置的属性值。 (10)a=set(0,'FactoryObjectTypePropertyName')返回所有对象中指定的属性名称FactoryObjectTypePropertyName的所有可能的属性值。 (11)a = set(h,'属性名','属性值')设置句柄值为h的对象的与属性名对应的属性值。 (12) set(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName2',...)对句柄值为h的对象设置特定属性名称的属性默认值。 (13)H = findobj;返回Root对象与其所有子对象的句柄值 (14)H = findobj(h);返回h变量的句柄值 (15)H = findobj(?属性名称…,?属性值…);依据对象的属性名称和属性值找出匹配的对象句柄值。 (16)H = findobj(ObjectHandles,?属性名称…,?属性值…);根据限定的对象列表找出与对象的属性名称和属性值匹配的对象句柄值 (17)gcf返回当前Figure对象的句柄值 gca返回当前axes对象的句柄值 gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中Figure对象的属性篇 MATLAB函数句柄和M文件 第 6 章M 文件和函数句柄 6.1 Matlab控制流 6.2 脚本文件和函数文件 6.3 Matlab的函数类别 6.4 函数句柄 6.1 MATLAB 控制流 6.1.1 if-else-end 条件控制 6.1.2 swith-case 控制语句 6.1.3 for 循环和while 循环 6.1.4 控制程序流和的其他常用指令 6.1.1 if-else-end 条件控制 0.1x 2 例 6.1-1 】已知y e sin x 0.5(x 0.1) sin x ,在50 x 5 区间,求函数的最小值。 回顾与复习 : [x,fval,exitflag,output]=fminbnd(fun,x1,x2,options) 求一元函数在区间 (x1, x2)中极小值 在第四章中采用的方法 ( 1)采用优化算法求极小值 x1=-50;x2=5; % yx=@(x)(sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1)); [xc0,fc0,exitflag,output]=fminbnd(yx,x1,x2) <9> % ( 2)据图形观察,重设 fminbnd 的搜索区间 xx=[-23,-20,-18]; % fc=fc0;xc=xc0; % for k=1:2 [xw,fw]=fminbnd(yx,xx(k),xx(k+1)); <16> if fw 函数及其表示方法 编稿:丁会敏审稿:王静伟 【学习目标】 (1)会用集合与对应的语言刻画函数,会求一些简单函数的定义域和值域,初步掌握换元法的简单运用. (2)能正确认识和使用函数的三种表示法:解析法,列表法和图象法.了解每种方法的优点.在实际情境中,会根据不同的需要选择恰当的方法表示函数. (3)求简单分段函数的解析式;了解分段函数及其简单应用. 【要点梳理】 要点一、函数的概念 1.函数的定义 设A、B是非空的数集,如果按照某个确定的对应关系f,使对于集合A中的任意一个数x,在集合B中都有唯一确定的数f(x)和它对应,那么就称f:A→B为从集合A到集合B的一个函数. 记作:y=f(x),x∈A. 其中,x叫做自变量,x的取值范围A叫做函数的定义域;与x的值相对应的y值叫做函数值,函数值的集合{f(x)|x∈A}叫做函数的值域. 要点诠释: (1)A、B集合的非空性;(2)对应关系的存在性、唯一性、确定性;(3)A中元素的无剩余性;(4)B中元素的可剩余性。 2.构成函数的三要素:定义域、对应关系和值域 ①构成函数的三个要素是定义域、对应关系和值域.由于值域是由定义域和对应关系决定的,所以,如果两个函数的定义域和对应关系完全—致,即称这两个函数相等(或为同一函数); ②两个函数相等当且仅当它们的定义域和对应关系完全—致,而与表示自变量和函数值的字母无关. 3.区间的概念 (1)区间的分类:开区间、闭区间、半开半闭区间; (2)无穷区间; (3)区间的数轴表示. 区间表示: <<= {x|a≤x≤b}=[a,b]; x a x b a b {|}(,); (] x a x b a b ≤<=; {|}, x a x b a b {|}, <≤=;[) (][) x x b b x a x a ≤=∞≤=+∞. {|}-,; {|}, 要点二、函数的表示法 1.函数的三种表示方法: 解析法:用数学表达式表示两个变量之间的对应关系.优点:简明,给自变量求函数值. 图象法:用图象表示两个变量之间的对应关系.优点:直观形象,反应变化趋势. 列表法:列出表格来表示两个变量之间的对应关系.优点:不需计算就可看出函数值. 2.分段函数: 分段函数的解析式不能写成几个不同的方程,而应写函数几种不同的表达式并用个左大括号括起来,并分别注明各部分的自变量的取值情况. 要点三、映射与函数 1.映射定义: 设A、B是两个非空集合,如果按照某个对应法则f,对于集合A中的任何一个元素,在集合B中都有唯一的元素和它对应,这样的对应叫做从A到B的映射;记为f:A→B. 象与原象:如果给定一个从集合A到集合B的映射,那么A中的元素a对应的B中的元素b叫做a的象,a 函数句柄和匿名函数 内联函数inline 下面代码创建一个内联函数f: >> f = inline('1./((x-3).^2+0.01)+1./((x-.9).^2+0.04)-6','x') f(x) = 1./((x-3).^2+0.01)+1./((x-.9).^2+0.04)-6 上例中,函数inline从一个字符串创建一个函数,并以x为输入变量。要在一个函数中调用内联函数,只要将该内联函数的名字作为输入参数传递给函数即可。例如,要将quad(Fun,low,high)中的Fun 换为上面的内联韩式f,只要按下面的方式调用即可: quad(f,low,high)。 要验证一个由字符串表示的函数或一个内联函数,可以使用feval函数。下面的代码验证了正弦函数和前面创建的f函数 >> y = feval('sin',pi*(0:4)/4) y = 0 0.7071 1.0000 0.7071 0.0000 >> z = feval(f,[1- 0 1]) z= -5.1378 5.1765 16 匿名函数 除了字符串函数和内联函数外,还由一种函数类型:匿名函数,并用函数句柄表示它。在应用中并不鼓励用户使用前两种方法,而是要尽量使用匿名韩式句柄来引用函数。下面代码给出了一个匿名函数的例子: f = @ (x) 1./((x-3).^2+0.01)+1./((x-.9).^2+0.04)-6; 其中,@符号意味这等号左边是一个函数句柄。@后面的(x)定义了函数的输入参数,最后一部分是函数表达式。我们同样可以利用feval 函数来验证匿名函数,例如,可以使用下面代码验证af_humps:>> z = feval(af_humps,[-1 0 1]) z = -5.1378 5.1765 16.0000 其实,用户根本没有必要利用feval函数来验证匿名函数,因为匿名函数可以使用自己的函数句柄直接进行验证,例如,上面的例子可以简写为: >> z = f([-1 0 1]) z =VCMFC编程各种窗口句柄获取函数详解
MATLAB M文件与M函数
matlab 匿名函数 函数句柄
高一数学必修1 函数及其表示练习题
matlab符号表达式转换为函数句柄
D实验五 M文件和MATLAB程序设计
函数及其表示练习题
进程句柄获取
1.2函数及其表示练习题及答案
matlab句柄属性
高一数学上册第一章函数及其表示知识点及练习题(含答案)
MATLAB句柄式图形常用函数
MATLAB函数句柄和M文件
知识讲解-函数及其表示方法-基础
函数句柄和匿名函数