7MATLAB编程.docx
《7MATLAB编程.docx》由会员分享,可在线阅读,更多相关《7MATLAB编程.docx(32页珍藏版)》请在冰豆网上搜索。
7MATLAB编程
MATLAB语言的程序设计
1MATLAB语言概述
用MATLAB语言写的简单程序在前面章节中己有所接触,本章将系统介绍MATLAB语言的程序设计。
MATLAB语言的程序设计,简洁有效。
编程效率比C、BAsIC、FORTRAN等语言要高得多,维护容易。
程序的可读性很强,调用容易简单,因此Mathworks公司将MATLAB语言称之为第四代编程语言。
MATLAB有两种应用方式:
(1)一种是直接交互的指令行操作方式;
(2)另一种是M文件的编程工作方式。
在前一种工作方式下,MATLAB被当作一种高级“数学演算和图视器”来使用。
在前面几章已经看到了。
后一种工作方式表现为MATLAB所提供的完整而易于使用的编程语言。
从形式上讲,Matlab程序文件是一个ASCII码文件(标准的文本文件),扩展名一律为'.m'(M文件的名称由此而来),用任何字处理软件都可以对它进行编写和修改。
从特征上讲,MATLAB是解释性编程语言,其优点是用法简单。
程序容易调试,人机交互性强,缺点是由于逐句解释运行程序,故速度比编译型的慢。
但是较慢运行速度仅明显表现在M文件初次运行时,因为M文存放在内存中。
再次运行该文件时,MATLAB将直接从内存中取出代码运行,大大加快了运行速度。
从功能上讲,M文件大大地扩展了MATLAB的能力。
MathWork公司推出的一系列工具箱(Toolbox)就是明证。
这些工具箱全部是由M文件构成的。
工具箱(Toolbox)提供的指令数量大大地多于MATLAB的基本指令。
目前可见的专业工具箱(Toolbox)有控制、鲁棒控制、信号处理。
小波分析。
系统辨识,图像处理、优化,、样条分析、神经网络。
金融财政等。
专业工具箱(Toolbox)的指令全部是由M文件构成的。
因此可以说,不了解MAtlab语言的程序设计,不了解M文件,就无法了解Matlab能力的全貌。
M文件(程序)是解释性的程序语言,且以复数矩阵为基本运算单位,所以M文件无论从形式、结构、语法规则等方面都比一般的计算机语言简单、易写,易读得多。
另外,MATLAB本身是用C语言写的;M文件的语法又与C语言十分相像,因此熟悉C语言的读者会轻松地掌握matlabB的编程技巧。
M文件有两种形式:
命令文件(Scriptfi1e)和函数文件(FunctionFile)。
这两种文件的扩展名都是‘.m’
命令文件则可以将较多指令组合在一起,形成程序,存于硬盘或其他介质,运行时只需输入文件名字,MATLAB就会自动按顺序执行命令文件中的指令,从而避免了直接从键盘上逐行输入指令的麻烦,提高MATLAB的运行效率。
函数文件是另一种形式的M文件,它的第一句可执行语句是以fonction引导的定义语句。
在函数文件中的变量都是局部变量。
程序中可以直接调用,而不必在程序中直接写入函数表达方式,并可以多处、多次地调用。
1.1命令文件
命令文件中的语句可以访问MATLAB工作路径中的所有数据。
运行过程中,产生的所有变量均是全局变量。
这些变量一旦生成,就一直保存在内存空间中,除非用户运用clear指令将它们清除。
运行一个命令文件等价于从指令窗(CommandWindows)中按顺序连续运行文件里的指令。
由于命令文件只是一串指令的集合,因此程序不需要预先定义,而只需按在指令窗中的指令输入顺序依次将指令编辑在命令文件中就可以。
例:
通过M文件,画出下列分段函数所表示的曲面。
1)用MATLAB提供的编辑工具编写以下内容(用记事本(notebook)编写,也可用word编写。
存时加后缀‘.M’。
输入程序(fdhs.m)
%通过M文件,画出下列分段函数所表示的曲面,并转动图形,全面考察此三维曲面
a=2;b=2;
clf;
x=-a:
0.2:
a;y=-b:
0.2:
b;
fori=1:
length(y)
forj=1:
length(x)
ifx(j)+y(i)>1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));
elseifx(j)+y(i)<=-1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));
elsez(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2);
end
end
end
axis([-a,a,-b,b,min(min(z)),max(max(z))]);
colormap(flipud(winter));surf(x,y,z);
2)选择菜单【文件】中的【保存】子项,将所写文件存放于磁盘的自定义的工作目录C:
\matlab\mywork中,并起名为'fdhs.m'
3)在matlab系统中,加入自己建立的工作目录C:
\matlab\mywork;
'addpathC:
\matlab\mywork'
4)matlab指令窗中键入那文件名“fdhs”回车,运行,可在屏幕上看到图形内容。
说明:
*l)“%”:
注释符号。
首行注释为在线帮助内容。
MATLAB指令窗中键入“helpfdhs”,可以看到注释内容
"通过M文件,画出下列分段函数所表示的曲面"
*2)fdhs指令的变量a,b,I,j,x,y等已存于内存,可用who,whos查看。
*3)路径要明确
*4)利用help可以得到函数文件中的帮助内容
例:
用FLOW定义了一个有限喷射箱中的流体速度四维样本数阵。
以下程序表达这个喷射箱中连续的流速剖面上的速度变化。
%move1.m
figure
(1)
clf
[x,y,z,v]=flow(20);
slice(x,y,z,v,0,3,-3,'linear'),%FLAT¡êINTERP¡êFACETED
fori=0:
1:
10
slice(x,y,z,v,i,3,-3,'linear')
%shadinginterp;
colorbar('horiz')
drawnow
end
[xi,yi,zi]=meshgrid(0.1:
0.25:
10,-3:
0.25:
3,-3:
.25:
3);
vi=interp3(x,y,z,v,xi,yi,zi);%viis25-by-40-by-25
slice(xi,yi,zi,vi,[69.5],2,[-2.2]),shadingflat
指令FLOW:
三维样本函数,是有限桶的水流喷射器产生的水流速度场,可以演示SLICE和INTERP3的指令的用法。
V=FLOW;产生50-25-25矩阵。
V=FLOW(N)产生2N-N-N矩阵。
V=FLOW(X,Y,Z)给出点(X,Y,Z)处的速度。
[X,Y,Z,V]=FLOW(...)返回坐标。
例:
用球体表现温度场的不同点的温度,温度场由v定义。
%move2
[xsp,ysp,zsp]=sphere;
[x,y,z]=meshgrid(-2:
.2:
2,-2:
.25:
2,-2:
.16:
2);%绘制网格
v=(-x.^4-y.^4-z.^4);
slice(x,y,z,v,2,2,-2);%温度场边界
fori=-3:
.2:
1.5
ifi>-3
delete(hslicer)%删除图形,hslicer,是slicer图形的句柄。
end
hsp=surface(xsp+i,ysp+i,zsp);%画球,返回‘球’的图形柄
rotate(hsp,[100],0);%依向量转动,
xd=get(hsp,'XData');
yd=get(hsp,'YData');
zd=get(hsp,'ZData');
delete(hsp)
holdon
hslicer=slice(x,y,z,v,xd,yd,zd);
axistight
xlim([-33]);
view(-10,30)
drawnow
holdon
axistight
xlim([-33]);
view(-10,30)
drawnow
holdon
end
1.2函数文件
每一个函数文件都定义一个函数。
函数文件的第一行包含function,作为标识。
事实上,matlab提供的函数指令大部分都是由函数文件定义的。
函数被看作系统“黑箱”输入,合乎系统要求的数据,经系统“黑箱”处理加工,输出结果。
对应用者来说,函数“黑箱”系统的结构(计算原理、内部参数结构,内部编程结构等)不是很重要的,重要的是要知道,输入数据的要求形式,物理或实际意义、输出结果物理或实际意义、函数文件的使用语法。
对一个合乎标准的函数文件或指令文件,输入数据,输出结果,使用语法必须以注释形式放在文件的头部。
使得应用者可以用在线帮助(help)查阅。
这一点对指令文件也一样重要。
函数文件与命令文件区别是:
命令文件的变量在文件执行完后保留在内存中;由函数文件内定义的变量仅在函数文件内部起作用,当函数文件执行完后,这些内部变量将被清除。
例;把上节例中的命令文件改成函数文件。
(l)在字处理器中编写以下内容。
并存放于磁盘C:
\matlab\mywork目录,
functionffdhs(a,b)
%通过function文件,画出下列分段函数所表示的曲面
a=2;b=2;
clf;
x=-a:
0.2:
a;y=-b:
0.2:
b;
fori=1:
length(y)
forj=1:
length(x)
ifx(j)+y(i)>1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));
elseifx(j)+y(i)<=-1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));
elsez(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2);
end
end
end
axis([-a,a,-b,b,min(min(z)),max(max(z))]);
colormap(flipud(winter));surf(x,y,z);
(2)在matlab工作区运行‘ffdhs(2,2)’;或在word中以'ffdhs(2,2)'为细胞进行运算。
(3)who;whos将不显示变量f,i;等。
f,I使局部变量,n,u是全局变量。
(4)functionf=ffdhs(a,b)中是函数名称(在程序中);函数文件名称(在存储介质中)一般也取相同的字符‘ffdhs’。
(5)建议函数文件名称=函数名称。
(6)利用help可以得到函数文件中的帮助内容。
helpffdhs
1.3P-code文件
M文件第一次调用,进行介释性的运行,并生成P-码文件,第二次调用时,运行内存的P-码文件,这个P-码文件,是临时性文件。
P-码文件可以保留。
例对logexp.m进行P-码文件处理;
(1)pcodelogexp–inplace:
在logexp.m的目录下产生logexp.p文件(logexp.m的P-码文件)
(2)pcodelogexp:
在当前目录下产生logexp.p文件(logexp.m的P-码文件),内存的P-码文件以存在。
(3)inmem例出内存中的全部P-码文件。
(4)clearfunction:
清除内存中的全部P-码文件。
(5)clearlogexp:
清除内存中的logexp的P-码文件。
2.MATLAB基本与语法
计算机语言的语句可分四大类:
(1)说明性语句
如注释语句,数据类型定义等,是一类无操作发生的指令。
(2)赋值语句
例:
'a=2'
'inputa'
(3)流程控制语句
例:
1)for…end
2)While…end
3)if
4)switch…case
5)try…catch
6)block
(4)输入输出语句
输入输出语句包括流程中的数据交互,文件的处理等。
2.1说明性语句
1)“%”注释符。
语句冠以“%”后,语句是非执行语句。
在MATLAB文件中,位置在程序开头的注释语句是在线帮助的内容,地位重要。
编写良好的在线帮助的内容是A4AryAB编程的基本要求。
2)数据的类别说明
在MATLAB中,关于数据的说明不是很要紧,大部分MATLA13指令多会自动地识别数据的类别,根据数据的类别采用相应的计算方法。
因此数据的说明往往是隐含在赋值、函数调用或其他指令中。
例:
A=[1,2,3;3,4,5],定义了是2*3矩阵,这是维数说明,MAllAB的基本运算对象是复数矩阵,因此数据类犁无须进行说明。
但,予先定义可以减少运算量,使运算速度加快。
3)定义或影响matlab系统运行方式的指令。
*l)符号运算的精度定义,digits(n)
*2)可视图形中的阴影与网格模式shading
shadingflat设置默认的投影.
shadinginter设置交错的投影
shadingfaceted设置正面投影
*3)加入路径addpath
*4)定义全局变量
globalx,y,z
*5)色调的定义
colormap(map)
2.2赋值语句
(l)'='赋值
最常用、最直接的赋值方法
f=123
f=x.^2+2.*x
(2)函数、指令调用赋值
调用赋值是对函数、指令参数(哑变量)的赋值
例;fibfun(n)可以写成fibfun(200),赋以n值为200。
函数、指令调用赋值要满足函数、指令对参数的要求。
参数不满足函数、指令的要求,可使函数、指令无法正确的运行。
(3)人机交互赋值
*1)在线数据输入(键盘输入),input
R=input('Whatis\nyourname','s')
注意1:
R:
返回值(数值或字符,由's'决定)
'Whatisyourname':
提示符号
's':
有's'返回字符(MATLABstring);无's'
返回数值
\n:
提示文本换行
*2)在线函数式输入(键盘输入):
一个非常有用的调试指令'keyboard'
写一函数,存入硬盘取名“kb”。
functiony=kb(x)
keyboard
运行“KB”
addpathd:
\matlabjg
kb
注意1:
键盘指令(Keyboard)不可以在word中作MATLAB引擎(Engine)(或称细胞(cell))使用。
只能在matlab窗体中运行。
出现提示符“K”,输入
x=0:
0.0l:
l;
y=x^2;
plot(x,y)
return
注意2:
'return'是返回标志,必须输入;也可以以;'DBQUIT'代替'return'
'return'y与'dbquit'的区别:
'return':
返回出口,继续执行
'dbquit':
返回出口,调用的M文件终止执行
得到X^2的曲线图。
实际执行的顺序情况
functiony=kb(x)
x=0:
0.0l:
l;
y=X^2;
plot(x,y)
return
2.3流程控制语句
l)基本执行顺序
基本执行顺序是语句出现先后。
这是基本特征。
2)for…end
语法:
FOR变量=表达式,语句,...,语句END
例:
FORI=1:
N,
FORJ=1:
N,
A(I,J)=1/(I+J-1);
END
END
FORS=1.0:
-0.1:
0.0,END;%步长是-0.1
FORE=EYE(N),...ENDsetsEtotheunitN-vectors.
注:
(1)“BREAK”用于跳出loop.
(2)循环量可以是向量。
例
fore=eye(3)
e
end
e=
1
0
0
e=
0
1
0
e=
0
0
1
例
a=[1,2,3;4,5,6;7,8,9];
f=[0;0;0];
fore=a
f=f+e;
end
f
f=
6
15
24
3)While…end
语法:
WHILEexpression
statements
END
注:
(1)表达式(expression)常用关系运算符如下:
eq-Equal==
ne-Notequal~=
lt-Lessthan<
gt-Greaterthan>
le-Lessthanorequal<=
ge-Greaterthanorequal>=
例:
*1)eq(1,1)=1;le(6,1)=0
*2)1==1=1;6<=1=0
逻辑运算符如下:
and-LogicalAND&
or-LogicalOR|
not-LogicalNOT~
xor-LogicalEXCLUSIVEOR
any-Trueifanyelementofvectorisnonzero
all-Trueifallelementsofvectorarenonzero
例:
a=1;b=0;and(a,b)=0;a&b=0
any([0,1,0])=1(是);all([0,1,0])=0(否)
any([0,0,0])=0(是);all([0,0,0])=0(否)
any([1,1,1])=1(是);all([1,1,1])=1(否)
注:
(2)“BREAK”用于跳出loop.
例:
a=[1,2,3;4,5,6;7,8,9];
e=0*a;
f=e+eye(size(e));
n=1;
whilenorm(e+f-e,1)>0,%第一类范数
e=e+f;
f=a*f/n;
n=n+1;
end
norm(e+f-e,1)
ans=
0
4)if
语法:
IFexpression
statements
ELSEIFexpression
statements
ELSE
statements
END
例:
a=zeros(3)
fori=1:
1:
3
forj=1:
1:
3
ifi==j
a(i,j)=2;
elseifabs(i-j)==1
a(i,j)=-1;
else
a(i,j)=0;
end
end
end
a
a=
000
000
000
a=
2-10
-12-1
0-12
例:
逻辑运算判别以绘直线图,以指令文件logexp.m,存入
%逻辑运算判别以绘直线图
x=-1:
0.1:
1;
input('i=');j=input('j=');
ifi==j
y=x*0;
plot(x,y)
elseifi>j
y=x;
plot(x,y)
else
y=-x;
plot(x,y)
end
5)switch…case
语法:
switchswitch_expr
casecase_expr,
statement,...,statement
case{case_expr1,case_expr2,case_expr3,...}
statement,...,statement
...
otherwise,
statement,...,statement
end
例
method='bilinear';
switchlower(method)
case{'linear','bilinear'}
disp('methodislinear')
case'cubic'
disp('methodiscubic')
case'nearest'
disp('methodisnearest')
otherwise
disp('unknownmethod.')
end
methodislinear
6)try…catch
用于错误的捕捉
常用格式:
try,statement,...,statement,catch,statement,...,statementend
例:
当a,b维数不恰当时,打印d,当a,b维数恰当时,打印c。
用b,b'分别执行。
b=[2,3,4];
a=[1,2,3];
try
c=a+b
catch
b=b';
d=a+b
end
c=
357
7)强行终止:
break
用于while;for句式中。
(8)暂停语句pause调试用
*1)pause(n):
暂停n秒
*2)pause:
暂停;等待键盘激活,恢复运行。
*3)pauseon(off):
打开(关闭)pause功能。
(9)断点设置dbstop调试用
dbstopin'路径+文件名'at行号
dbstopin'路径+文件名'at'调用函数名'
dbstopin'路径+文件名
dbstopinerror(出错误时)
dbstopinwarning(警告时)
dbstopinnaninf(出现非数时)
dbcont
dbstep
dbquit
(10)函数调用的返回return
例
functiony=det(a)
ifisempty(a)
y=1
return
else
……
end
(11)嵌套式定义函数
function(function1,function2)=function3
利用已有函数定义function3.m函数文件的输出项function1,function2。
function[mean,stdev]=stat(x)
n=length(x);
mean=avg(x,n);
stdev=sqrt(sum((x-avg(x,n)).^2/n);
mean是已经定义的函数如下,利用mean定义stat(x)函数如上
functionmean=avg(n,x)
mean=sum(x)/n;
return
(12)keyboard见前面赋值语句介绍。
输入输出语句
(1)实时交互输入输出
input;keyboard
(