5MATLAB程序设计基础.docx
- 文档编号:11681993
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:16
- 大小:31.24KB
5MATLAB程序设计基础.docx
《5MATLAB程序设计基础.docx》由会员分享,可在线阅读,更多相关《5MATLAB程序设计基础.docx(16页珍藏版)》请在冰点文库上搜索。
5MATLAB程序设计基础
第五节MATLAB程序设计
MATLAB命令有两种执行方式:
一种是交互式的命令执行方式,另一种是M文件的程序执行方式。
第一种执行方式在前面已经做了介绍,本节主要介绍后一种执行方式。
一、M文件
MATLAB是一种高效的编程语言,用户可以用普通的文本编辑器把一系列MATLAB语句写进一个文件里,然后给定文件名存储,文件的扩展名为.m,因此称之为M文件。
在运行文件时只需在MATLAB命令窗口下键入该文件名即可。
建立M文件的一般步骤是:
(1)打开文件编辑器:
这里指的是MATLAB的内部编辑/调试器,可以有几种不同的方式打开,最简单的方法是在操作桌面的工具栏上
选择(建立新文件)或选择
(打开已有的文件),也可以在命令窗口输入命令edit建立新文件或输入命令editfilename,打开名为filename的M文件。
如果已经打开了文件编辑器需要再建立新文件或打开其他的文件,可以用编辑器工具栏上相应的图标进行选择。
(2)编写程序内容:
可以编写新的文件内容,也可以修改已有的文件。
(3)保存文件:
M文件在运行之前必须先保存,可以选择编辑器工具栏上的
图标进行保存,也可以在File菜单下Save或Saveas…完成保存。
(4)运行文件:
在命令窗口输入要运行文件名即可开始运行。
如果在编辑器中完成编辑后需要直接运行,可以在编辑器的Debug菜单下SaveandRun选项(如果文件已经保存过,该选项则变为Run),一个更快捷的方法是按F5键执行运行。
M文件有两种形式:
命令文件(ScriptFile)和函数文件(FunctionFile)。
命令文件通常用于执行一系列简单的MATLAB命令,运行时只需输入文件名字,MATLAB就会自动按顺序执行文件中的命令。
和命令文件不同,函数文件可以接受参数,也可以返回参数,在一般情况下用户不能靠单独键入该文件名来运行函数文件,而必须由其他语句来调用。
MATLAB的大多数应用程序都是由函数文件的形式给出的,如求矩阵特征多项式的函数poly()。
两种形式M文件的比较见下表:
M文件
命令文件
函数文件
形式
只是一系列命令语句的组合,不需要任何说明与定义
文件中的第一行要用function来说明,然后再写程序内容
参数
没有输入参数,也不用返回参数
可以接受参数,也可以返回参数
数据
处理的数据是工作空间的数据
处理的是函数内部的局部变量,但也可以设置全局变量
应用
自动完成一系列规定的命令,并可以多次运行,作为普通的运行程序,便于调试和修改
常用于需要反复调用、并不断改变参数的用途上,可用于扩充MATLAB函数库和一些特殊的应用
运行
形式
只需在命令窗口下键入文件名即可运行
一般情况下不能靠键入文件名来运行,需要由其他语句调用
1.命令文件
命令文件是M文件中最简单的一种,不需要输入输出参数,用命令语句可以控制MATLAB工作空间的所有数据。
运行过程中,产生的所有变量均是全局变量,这些变量一旦生成,就一直保存在内存空间中,除非用户运行clear命令将它们清除。
运行一个命令文件等价于从命令窗口中按顺序运行文件里的命令。
由于命令文件只是一串命令的集合,因此程序不需要预先定义,而只是像在命令窗口中输入命令那样,依次将命令编辑在命令文件中即可。
例如:
建立一个命令文件将变量a,b的值互换,然后运行该命令文件。
首先建立命令文件并以文件名exch.m存盘
clear;
a=1:
10;b=[11,12,13,14;15,16,17,18];
c=a;a=b;b=c;
a
b
然后在MATLAB的命令窗口中输入exch,将会执行该命令文件,输出:
a=
11121314
15161718
b=
12345678910
调用该命令文件时,不用输入参数,也没有输出参数,文件自身建立需要的变量。
当文件执行完毕后,可以用whos查看工作空间中的变量。
这里会发现a,b,c仍然保留在工作空间中。
2.函数文件
如果M文件的第一个可执行行以function开始,该文件就是函数文件,每一个函数文件都定义一个函数。
事实上,MATLAB提供的函数命令大部分都是由函数文件来定义的。
从使用的角度看,函数是一个“黑箱”,把一些数据送进去,经加工处理,把结果送出来。
从形式上看,函数文件区别于命令文件之处在于命令文件的变量在文件执行完成后保留在工作空间中,而函数文件内定义的变量只在函数文件内部起作用,当函数文件执行完后,这些内部变量将被清除。
例如:
建立一个函数文件将变量a,b的值互换,然后在命令窗口调用该函数文件。
首先建立函数文件fexch.m
function[a,b]=exch(a,b)
c=a;a=b;b=c;
然后在MATLAB的命令窗口调用该函数文件
clear;
x=1:
10;y=[11,12,13,14;15,16,17,18];
[x,y]=fexch(x,y)
输出为:
x=
11121314
15161718
y=
12345678910
调用该命令文件时,既有输入参数,又有输出参数。
当文件执行完毕后,可以用whos查看工作空间中的变量。
这里会发现a,b,c未被保留在工作空间中。
例如:
average函数用于计算矢量中单元的平均值。
function y=average(x)
%average 计算矢量中单元的平均值;
% y=average(x),其中x是矢量,y是计算出的矢量中单元的平均值;
% 非矢量输入将导致错误
[m,n]=size(x); %判断输入量的大小
if(~((m==1)|(n==1))|(m==1&n==1)) %判断输入是否为矢量
error('必须输入矢量')
end
y=sum(x)/length(x); %计算
然后在MATLAB的命令窗口运行以下命令,便可求得1~1000的平均值。
z=1:
1000;
average(z)
输出为:
ans=
500.5000
3.局部变量与全局变量
通常,每一个由M文件定义的MATLAB函数都拥有自己的局部变量,这些变量独立于其他函数的局部变量和工作空间的变量,但是如果特别地定义一些变量为全局变量,这些变量就可以共享。
用关键词global就可以把一个变量定义为全局变量,在M文件中定义全局变量时,如果在当前工作空间已经存在了相同的变量,系统就会给出警告,说明由于将该变量定义为全局变量,可能会使变量的值发生改变,为避免发生这种情况,应该在使用变量前先将其定义为全局变量。
在MATLAB中对变量名是区分大小写的,因此为了在程序中分清楚而不至于出现错误,习惯上我们将全局变量定义为大写字母。
二、程序结构
MATLAB语言中除了按正常顺序执行的程序结构外,还提供了8种控制程序流程的语句,如for、while、if、switch、try、continue、break、return等。
1.循环语句
循环是指按照给定的条件,重复执行指定的语句,即是循环体,每循环一次,都 必须作出是否继续重复的决定,这个决定所依据的条件称为循环的终止条件。
MATLAB提供了两种循环方式:
for-end循环和while-end循环。
(1)for语句
for语句为计数循环语句,通常是把循环条件的初值、判别和变化放在循环的开头,这种形式就是for语句的循环结构。
语句格式为:
for循环变量=表达式1:
表达式2:
表达式3
循环体语句
end
其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。
步长为1时,表达式2可以省略。
for和end必须配对使用。
例1:
已知,
当n=100时,求y的值。
程序如下:
y=0;n=100;
fori=1:
n
y=y+1/i/i;
end
y
输出为:
y=
1.6350
如果n小于1,此循环仍然合法,但循环内的语句将不执行。
循环可以嵌套,需要注意的是在嵌套过程中每一个for都必须与end匹配,否则程序将出错。
例2:
循环的嵌套
m=3;n=4;
fori=1:
m
forj=1:
n
a(i,j)=1/(i+j-1);
end
end
formatrat
a
输出为:
a=
11/21/31/4
1/21/31/41/5
1/31/41/51/6
例3:
运用非1步长,1~19以内的奇数。
fori=1:
2:
19
a((i+1)/2)=i;
end
a
输出为:
a=
Columns1through6
1357911
Columns7through10
13151719
(2)while语句
while语句是条件循环语句,while循环使语句体在逻辑条件控制下重复不确定次,直到循环条件不成立为止。
while语句格式为:
while (条件)
循环体语句
end
其执行过程为:
若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。
例4:
用while语句实现例1。
while1
f=1/i/i;
y=y+f;
ifi==100
break
end
i=i+1;
end
y
输出为:
y=
2047/1252
在程序中,循环的条件为1,即循环条件总是满足的,这是一个永真循环。
为了使循环能正常结束,在循环体中加了一个if语句,当i等于100时,执行break命令,从而跳出for循环。
2.条件语句
条件语句是根据给定的条件成立或不成立,分别执行不同的语句。
在MATLAB中,if语句有三种结构。
(1)if-end语句
语句格式为:
if条件
语句体
end
当条件成立时,则执行语句体,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。
如当x是整数矩阵时,输出x的值。
语句如下:
iffix(x)==x
disp(x);
end
(2)if-else-end语句
语句格式为:
if条件
语句体1
else
语句体2
end
当条件成立时,则执行语句体1;否则执行语句体2。
例5计算分段函数
程序如下:
x=input(‘请输入x的值:
’);
ifx==10
y=cos(x+1)+sqrt(x*x+1);
else
y=x*sqrt(x+sqrt(x));
end
y
(3)if-elseif-end语句
语句格式为:
if条件1
语句体1
elseif条件2
语句体2
else
语句体3
end
首先计算条件1,若满足就执行语句体1,然后跳出if结构;若不满足条件1,则计算条件2,若满足则执行语句体2,然后跳出if结构;若前面的条件都不满足,就执行语句体3。
根据程序设计的需要可以使用多个elseif语句,也可以不用else语句。
3.分支语句
switch-case-end语句是通过对某个变量值的比较做多种不同的执行选择,以实现程序的分支结构的语句。
语句格式为:
switch 表达式
case 表达式1
语句体1;
case 表达式2
语句体2;
…
case 表达式m
语句体m;
otherwise
语句体m+1;
end
switch后面的表达式的结果是数值变量或字符变量,通过这个数值或字符与case后面的数值或字符相比较,满足哪一个case就执行哪一个case下面的语句体,如果所有case的都不满足,就执行otherwise下面的语句体,otherwise语句不是必须的,如果没有otherwise,当所有case都不满足跳出该分支结构。
switch与end必须配对使用。
例6某商场对顾客所购买的商品实行打折销售,标准如下(商品价格用price来表示):
price<200 没有折扣
200≤price<5003%折扣
500≤price<10005%折扣
1000≤price<25008%折扣
2500≤price<500010%折扣
5000≤price 14%折扣
求所售商品的实际价格。
程序如下:
price=input(‘请输入商品价格’);
switchfix(price/100)
case{0,1}
rate=0;
case{2,3,4}
rate=3/100;
casenum2cell(5:
9)
rate=5/100;
casenum2cell(10:
24)
rate=8/100;
casenum2cell(25:
49)
rate=10/100;
otherwise
rate=14/100;
end
price=price*(1-rate)
4.检测语句
try–catch语句主要用于检测错误并改变流程,语句格式为:
try
语句体1
catch
语句体2
end
首先执行try下面的语句体1,如果没有错误,执行完成后就跳出该结构,如果在执行这部分语句体时出现错误,则执行catch下面的语句体2。
可以用lasterr函数查询最后的错误信息,当查询结果为空字符串时表示语句体1执行成功。
例7 矩阵乘法运算要求两矩阵的维数相容,否则会出错。
先求两矩阵的乘积,若出错则自动转去求两矩阵的点积。
程序如下:
A=[1,3,4;-2,4,6];B=[-2,-5,8;6,8,3];
try
c=A*B;
catch
c=A.*B;
end
c
lasterr%显示出错原因
输出结果为:
c=
-2-1532
-123218
ans=
Errorusing==>*
Innermatrixdimensionsmustagree.
5.其他流程控制语句
(1)continue语句
continue语句用于控制for循环和while循环跳过某些执行语句,在for循环和while循环中,当出现continue语句时,则跳过循环体中所有剩余的语句,继续下一次循环。
在嵌套循环中,continue控制执行本嵌套中的下一次循环。
(2)break语句
break语句用于终止for循环和while循环的执行。
当遇到break语句时,则退出循环体,继续执行循环体外的下一个语句。
在嵌套循环中,break只存在于最内层的循环体中。
(3)return语句
return语句用于终止当前的命令序列,并返回到调用的函数或键盘,也用于终止keyboard方式,在MATLAB中,被调用的函数运行结束后会自动返回调用函数,使用return语句时将return插入被调用函数中的某一位置,根据某种条件迫使被调用函数提前结束并返回到调用函数。
三、数据的输入与输出
MATLAB不但是一个自包容的高效工作环境,而且也能与其他外部应用程序进行交换。
下面就简单的介绍一些数据输入与输出的内容。
1.数据的输入
数据输入的方法很多,究竟选择哪种方法取决于数据量的多少,数据的可读性,数据形式等。
下面介绍几种常用的方法。
(1)键盘输入:
如果数据不多(10~15个),那么利用[],直接键盘输入最方便。
数据较多时这种方法不好,一旦出错,无法修改。
(2)用M文件产生数据:
利用文本编辑器编辑一个命令M文件,通过运行该文件把按元素列表方式的数据引入MATLAB工作空间。
这种方法可利用文本编辑器修改数据,适用于较多数据的输入。
(3)从ASCⅡ码文件装载数据:
文本格式的数据文件中,数据以ASCⅡ码形式存储,带回车结尾的固定长度行,数与数之间以空格分隔。
这类文件可用load命令直接读入MATLAB,其内容存放在以文件名命名的变量中。
2.数据的输出
(1)利用diary命令输出数据:
在MATLAB命令窗口中运行diary命令可以在当前工作目录上产生一个名为diary的日记文件,它将记录此后MATLAB命令窗口中显示的内容(包括命令、中间运算结果、最终结果等)。
该文件可以用文本编辑器进行编辑,日记文件不仅提供数据,耐用还为以后用户撰写总结文件或报告提供便利的原始素材,关闭日记文件的命令为diaryoff。
再次打开日记文件,不会清除原有的内容,而是将新的内容接在后面。
(2)利用Notebook获取数据:
diary命令产生的日记文件的缺陷是内容比较混乱,同时不包含MATLAB运行中产生的数据图形,Notebook是更好的选择。
在Notebook环境下产生的M-book文件不仅文字质量高、版面规范漂亮,而且包括了MATLAB的命令、数据和图形。
更优越的是M-book中的MATLAB命令可以随时运行随时修改,MATLAB工作空间中的数据随之改变,M-book始终保持文件中的数据、图形与命令一致,运行Notebook的条件是要求所用的计算机上装有MSWord。
(3)save命令输出数据:
save命令将当前MATLAB内存中的变量存到文件中去。
3.save和load命令的使用
save和load命令是MATLAB与外部环境交换数据时最常用的命令。
save将MATLAB工作空间中的变量存入磁盘,而load命令则把磁盘上的数据调入工作空间。
(1)save命令的常用调用方法
● save将MATLAB工作空间中所有变量以二进制格式存入名为matlab.mat的缺省文件。
●savedfile将工作空间中的所有变量以二进制格式存入名为dfile.mat文件,扩展名自动生成。
●savedfilex 只把变量x以二进制格式存入名为dfile.mat文件,扩展名自动生成。
●savedfile.datx-ascii 将变量x以8位ASCⅡ码形式存入dfile.dat文件。
●savedfile.datx-ascii-double 将变量x以16位ASCⅡ码形式存入dfile.dat文件。
●save(fname,‘a’,‘-ascii’) fname是一具预先定义好的包含文件名的字符串,该用法将变量a以ASCⅡ码格式存入由fname定义的文件中。
在这种方法中,文件名是一个字符变量,因此可以方便地通过编程方法存储一系列的数据文件。
(2)load命令的常用方法
● load把磁盘文件matlab.mat的内容读入内存,由于存储.mat文件时包含了变量名的信息,因此回调时已直接将原变量信息带入,不需重赋变量。
● loaddfile 把磁盘文件dfile.mat内容读入内存。
● loaddfile.dat 把磁盘文件dfile.dat内容读入内存,这是一个ASCⅡ码文件,系统自动将文件名(这里是dfile)定义为变量名。
● a=load(fname) fname是预先定义好的包含文件名的字符串,将由fname定义文件名的数据文件调入变量a中,使用这种方法可以通过编程方便地调入一系列数据文件。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 程序设计 基础