《MATLAB程序设计基础教程》课件第3章_第1页
《MATLAB程序设计基础教程》课件第3章_第2页
《MATLAB程序设计基础教程》课件第3章_第3页
《MATLAB程序设计基础教程》课件第3章_第4页
《MATLAB程序设计基础教程》课件第3章_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章MATLAB程序设计3.1概述3.2循环程序3.3分支结构3.4人机交互语句3.5程序的常见错误处理 3.1概述

3.1.1MATLAB程序设计方法

MATLAB程序可以分为两类:交互式和M文件的编程。

对于一些简单问题的程序,用户可以直接在MATLAB的命令窗口中输入命令,用交互式的方式来编写。这种方式适用于命令比较简单,输入比较方便,同时处理问题的步骤较少的情况。但是,对于较复杂的问题,由于处理所需的命令较多,即需要逻辑运算、需要一个或多个变量重复验证、需要进行流程控制等,那么此时采用直接输入命令的方法则会引起不便。为此,MATLAB提供了一个合理的解决方法,就是事先将一系列MATLAB命令输入到一个文本文件中加以保存,只要执行该文件,则文件中所有MATLAB命令都被执行,其结果与直接在MATLAB的命令窗口中输入命令执行的结果一样。由于该文本文件以“.M”为扩展名,因此被称为M文件。当需要处理重复、复杂且容易出错的问题时,可以建立一个M文件,进行合理的程序设计,这就是M文件的编程工作方式。3.1.2MATLAB程序结构

MATLAB作为一种常用的编程语言,支持各种决策或流程控制结构。流程控制极其重要,因为它用过去、现在的计算影响将来的结果。MATLAB程序结构分为顺序结构、分支结构和循环结构,具体如图3-1所示。

由于这些结构经常包含大量的MATLAB命令,故经常出现在M文件中,而不是直接加在MATLAB提示符下。图3-1MATLAB程序结构

1.顺序结构

顺序程序结构是一种最简单的程序结构,将MATLAB语句按先后次序排列即可。系统在编译程序时,按照程序的物理位置顺序执行。这种程序容易编制,但是结构单一,能够实现的功能有限。例如:

a=1;b=2;c=3;

s1=a+b;

s2=s1+c;

s3=s2/s2;

2.分支结构

程序在运行过程中要根据不同的情况或条件作出判断,并依据判断的结果转向相应的处理程序,这种程序结构称为分支结构。

分支是通过条件转移指令实现的,进行分支结构程序设计之前,应首先确定要判断的是什么条件,以及当判断结果为不同的情况(“真”或“假”)时应该执行什么样的操作。MATLAB提供条件转移的if…end分支程序结构。

有的分支结构为多分支,可依次测试各个条件是否满足。若满足条件则转入相应分支入口,若不满足则继续向下测试,直到全部测试完。分支选择程序结构简单、直观,但执行速度慢。MATLAB提供条件转移的switch开关分支程序结构。

分支结构程序设计需要使用关系运算、逻辑运算、条件运算等。

3.循环结构程序设计

在日常的实际生活中,会经常用到“循环结构”,例如数据的累加计算等,但又与顺序结构和选择结构不同,无论是顺序还是选择分支语句,它们中的每一条语句一般只执行一次。而循环结构中,有时常要重复某几条语句,所以循环结构就是用于完成一些重复的操作,但它并不是单纯的重复执行,每次执行时,语句的参数一般都是不同的。

按循环控制方式分类可分为手动循环和自动循环。手动循环在程序运行时通过反复操作控件实现某事件过程的反复执行,自动循环是由程序中的语句控制的,是程序执行时根据循环的条件自动实现的循环。自动循环又可分为有条件循环(当循环条件满足或不满足时才执行的循环)和无条件循环(无条件地执行循环)。 3.2循环程序

3.2.1for循环

1.for循环的一般形式

for循环允许一组命令以固定的和预定的次数重复。For循环的一般形式:

forvariable=values

commands

end

commands是循环体语句组,这里的循环语句是以end结尾的,这与C语言的结构不完全一致。values可以是如表3-1所示的格式之一。

(1)  initval:step:endval形式。索引变量以增量形式循环,从初始值initval到结束值endval,增量步长为step,并重复循环。如果step为负数,则以减量方式循环,该形式的初始值initval大于结束值endval。

fors=s1:s2:s3

commands

...

end

注意:s是一个合法的字符串代表循环变量。s1、s2、s3可以是标量数字s1是起始值;s2是步长,如果步长s2的值为1,则可以省略;s3是终了值。例3-2-1

求出的值。

解该例可以作下列的循环:

>>x=0;

fori=1:1:100

x=x+i;

end;

>>x

结果为x=5050

(2) initval:endval形式。索引变量以增量形式循环,从初始值initval到结束值endval,增量步长为1,并重复循环。

在上例的式子中,可以看到for循环语句中s2的值为1。在实际编程中,如果s2的步长值为1,则可以在该语句中省略,故该语句可以简化成fori=1:100。

(3) valArray形式。在每个迭代,从数组valArray列的子列创建一个列向量index。例如,在第一次迭代,index=valArray(:,1)。循环执行n次,其中n是valArray列的最大数字,即for循环按照数组的列数决定循环次数,每执行一次for循环,index就取数组的一个列作为其值,直到最后一列。

forindex=V

commands

end

在for和end语句之间的循环体语句组“commands”按数组中的每一列执行一次。在每一次迭代中,index被指定为数组的一列,在第n次循环中,index=V(:,n),即V的第n列。例如:

A=[0.81470.63240.95750.95720.4218;

0.90580.09750.96490.48540.9157;

0.12700.27850.15760.80030.7922;

0.91340.54690.97060.14190.9595];

forn=A

s=n*2;

end

第5次循环结果:

0.8436

1.8314

1.5844

1.9190上面的语句就等价于:

forindex=1:5,m=A(:,index);

s1=m*2;

end

任何合法的数组生成语句都可以作为条件数组。

MATLAB并不要求循环点等间距,假设V为任意一个向量,则可以用

fori=V来表示循环,这时valArray只有一个向量V,其元素必须是正整数。例如,在命令行输入:

>>V=[12357];

forn=V

x(n)=sin(n*pi/10);

end

则输出结果:

>>x

x=0.30900.58780.809001.000000.8090

程序语句的意思是:对n等于1到V,求所有语句的值,直至下一个end语句。第一次通过for循环n=1;第二次,n=2;如此继续,直至n=7。在实际编程中,采用循环语句会降低其执行速度,所以前面的例3-3-1程序可以由下面的命令来代替:

i=1:100;

mysum=sum(i)

在这一语句中,首先生成了一个向量i,然后用内部函数sum()求出i向量的各个元素之和。

更简单地,该语句还可以写成sum(1:100)。如果前面的100改成10 000,再运行这一程序,则可以明显地看出,后一种方法编写的程序比前一种方法快得多。

2.for循环的嵌套

在一个for循环中,可以根据需要嵌套另外的多个for循环。例如:

forn=1:5

form=5:-1:1

B(n,m)=n^2+m^2;

end

disp(n)

end

循环结果:

1

2

3

4

5例3-2-2

列出构成hibert矩阵的程序。

解程序如下:

formatrat,n=input('n='),

fori=1:n

forj=1:n

h(i,j)=1/(i+j-1);

end

end

h

n=5

h=

11/21/31/41/5

1/21/31/41/51/6

1/31/41/51/61/7

1/41/51/61/71/8

1/51/61/71/81/93.2.2while循环

与for循环以固定次数求一组命令的值相反,while循环以不定的次数求一组语句的值。while循环的一般形式是

whileexpression

commands

end

只要表达式expression里的所有元素都为真,就可以执行while和end语句之间的commands。通常,表达式的求值给出一个标量值,但数组值也同样有效。在数组情况下,所得到数组的所有元素必须都为真。例3-2-3while循环。

解在例3-2-1中同样的问题,在while循环结构下可以表示为

>>x=0;i=1;

while(i<=100)

x=x+i;

i=i+1;

end

>>x

x=50503.2.3break语句

break命令强迫for循环或while循环提早结束,当执行break语句时,MATLAB跳到循环体外下一个语句。

如果一个break语句出现在一个嵌套的for循环或while循环结构里,那么MATLAB只跳出break所在的那个循环,不跳出整个嵌套结构。3.2.4continue语句

continue命令一般用在for循环或while循环中,通过if语句使用continue命令,当满足语句if条件时,continue命令被调用。与break语句不同的是,执行continue命令后,系统只是不再执行相关命令,而不跳出当前循环体外。

例3-2-5

计算magic.m文件有效文本的行数。

解程序如下:

fid=fopen('magic.m','r');

count=0;

while~feof(fid)

line=fgetl(fid);

ifisempty(line)|strncmp(line,'%',1)

continue

end

count=count+1;

end

disp(sprintf('文件有效文本有%d行',count));

文件有效文本有25行。3.2.5end语句

end命令用于终止for、while、switch、try和if语句,每一个end与最近的for、while、switch、try或if语句成对出现。

end也可以用于索引表达式中,代表最后一个索引。例如:X(3:end)和

X(1,1:2:end-1)。 3.3分支结构

3.3.1条件转移结构

很多情况下,命令的序列必须根据条件关系的检验结果有序地执行,这种根据条件而转移的分支结构是条件转移结构。

判断表达式紧跟在关键字if后面,使得它可以首先被计算,判断其值为真否。若计算判断表达式的结果为1,判断值为真,则执行其后的执行语句;若结果为0,判断值为假,则跳过、不予执行。

条件转移语句与C语言类似,条件转移结构包括以下三种:if…end、if…else…end、if…elseif…else…end。

1.if…end

当只有一种选择时,使用该形式。此时的程序结构如下:

ifexpression

commands

end

expression是条件表达式,commands是执行代码块。这是最简单的判断语句,只有一个判断语句。其中的表达式为逻辑表达式,当表达式expression结果为真时,执行相应的语句commands,否则,直接跳到end下一段语句。

如果在表达式中的所有元素为真(非零),那么就执行if和end语言之间的commands。当表达式包含有几个逻辑子表达式时,即使前一个子表达式决定了表达式的最后逻辑状态,仍要计算所有的子表达式。例如:

>>apples=10;

>>cost=apples*25

cost=

250

>>ifapples>5 %如果购买量大于5,给予20%的价格折扣

cost=(1-0.2)*cost;

end

>>cost

cost=

200

2.if…else…end

当程序有两个选择时,可以选择if…else…end结构,此时的程序结构如下:

ifexpression

commands1

else

commands2

end

当判断表达式expression为真时,执行代码块commands1,否则执行代码块commands2。例3-3-2

输入数n,判断其正负性。

解程序如下:

m=input('m='),

ifm<0

disp('m为负数!'),

else

disp('m为正数!'),

end

m=-9

m=

-9

m为负数!

m=7

m=

7

m为正数!

3.if…elseif…else…end

上面的两种形式中,分别包含一个选择和两个选择,当判断包含三个或多个选择时,可以采用elseif语句,其结构如下:

ifexpression1

commands1

elseifexpression2

commands2

elseif...

...

...

else

commands

end例3-3-3

输入数n,判断其正负及奇偶性。

解程序如下:

n=input('n='),

ifn<0

A='负数',

elseifrem(n,2)==0

A='偶数',

else

A='奇数',

end

n=5

n=

5

A=

奇数3.3.2switch开关结构

MATLAB中的另一种分支结构为开关分支语句。开关分支语句的结构如下:

switchexpression

caseexpression_1

commands_1

caseexpression_2

commands_2

...

otherwise

commands

end其中的分支语句开关表达式expression为一个变量,可以是数值变量或者字符串变量,如果该变量的值与某一条件expression_n相符,则执行相应的语句;否则执行otherwise后面的语句。在每一个条件中,可以包含一个条件语句,可以包含多个条件,当包含多个条件时,将条件以单元数组的形式表示。例如:

>>method=‘Bilinear’;

>>switchlower(method)

case{‘linear’,‘bilinear’}

disp(‘Methodislinear’)

case‘cubic’

disp(‘Methodiscubic’)

case‘nearest’

disp(‘Methodisnearest’)

otherwise

disp(‘Unknownmethod.’)

end

显示结果为

Methodislinear

MATLAB的分支语句类似于C语言的分支语句,但是又不完全相像,MATLAB开关语句与C语言的区别如下:

(1)当开关表达式的值等于表达式expression_1时,将执行语句段commands_1,执行完语句段commands_1后将转出开关体,即MATLAB语句从上到下依次判断条件,条件符合则执行相应的代码块,之后退出该分支语句,无需像C语言那样在下一个case语句前加break语句,所以本结构在这点上和C语言是不同的。

(2)当需要在开关表达式满足若干个表达式之一时执行某一程序段,则应该把这样的一些表达式用大括号括起来,中间用逗号分隔。事实上,这样的结构是MATLAB语言定义的单元结构。

(3)当前面枚举的各个表达式均不满足时,则将执行otherwise语句后面的语句段,此语句等价于C语言中的default语句。

(4)在case语句引导的各个表达式中,不要用重复的表达式,否则列在后面的开关通路将永远也不能执行。

(5)程序的执行结果和各个case语句的次序是无关的。例3-3-4

判断输入数n的奇偶空的程序。

解程序如下:

n=input('n=');

switchmod(n,2);

case1;A='奇';

case0;A='偶';

otherwise;A='空';

end

A

n=6

A=偶3.3.3try-catch试探结构

MATLAB从5.2版本开始提供了一种新的试探式语句结构,用于捕获MATLAB编译时出现的错误,其一般的形式为

try

语句段1

catch

语句段2

end

try块以关键字try开始,结束于catch关键字,catch块以关键字catch开始,结束于end关键字。本语句结构首先试探性地执行语句段1,如果在此段语句执行过程中没有出现错误,则直接跳到end。

如果在此段语句执行过程中出现了错误,则直接跳到catch模块。在catch模块中将错误信息赋给保留的lasterr变量,转而执行语句段2中的语句。语句段2可以根据获取的该错误信息,执行相应的动作。

try-catch试探结构也可以嵌套使用。 3.4人机交互语句

3.4.1echo命令

echo命令使文件命令在执行时可见,对程序的调试和演示有用。语法如下:

echoon/off:打开(关闭) echo命令。

echo:在打开、关闭echo命令之间切换。

echofilenameon/off:打开(关闭)文件名为filename的M文件。

echoon/offall:打开(关闭)所有的M文件。3.4.2用户输入提示命令input

input命令显示用户输入提示,并接受用户输入。语法如下:

(1) evalResponse=input(prompt):在屏幕上显示提示的字符串,等候用户在键盘的输入,并赋值于变量evalResponse。

(2) strResponse=input(prompt,'s'):把用户在键盘的输入,作为一个MATLAB串返回。例如:

>>R=input(‘Whatisyourname?’,’s’)3.4.3等待用户反应命令pause

pause命令暂停程序执行,等待用户反应。语法如下:

pause:pause命令暂停程序执行,等待用户反应,用户单击任意键后,程序重新开始执行。

pause(n):n秒后继续运行。

pauseon:显示并执行pause命令。

pauseoff:显示但不执行该命令。 3.5程序的常见错误处理

3.5.1错误的产生

在MATLAB程序设计或开发函数M文件过程中,容易产生两类错误:语法错误和运行时错误。

当MATLAB计算一个表达式的值或一个函数被编译到内存时会发现语法错误。一旦发现语法错误,MATLAB立即标志这些错误,并提供有关所遇到的错误类型,以及发生错误处M文件的行数。给定这些反馈信息,就很容易纠正这些错误。运行时的错误是指当程序试图执行一个系统不能运行的动作时导致的错误。当发现运行错误时,MATLAB把控制权返回给命令窗口和MATLAB的工作空间,失去了对发生错误的函数空间的访问权,用户不能询问函数工作空间中的内容排除问题。因此,即使MATLAB标志了运行错误,但找出错误一般比较困难。

含有选择结构和循环结构的程序,比只含简单的顺序结构的程序出错的概率大得多。3.5.2NaNs错误、除数为0的处理

1.NaNs错误

当一些操作结果导致空矩阵或NaNs时,最容易发生运行错误,任何有关NaNs的操作都返回NaNs值。因此,如果有可能出现NaNs结果,则当出现NaNs时,最好运用逻辑函数isnan()来执行一些缺省操作。语法如下:

TF=isnan(A):返回一个与A大小相同的数组,包含逻辑1(即true),元素为NaN;逻辑0(即false),元素不为NaN。对于一个复数z,如果z的实数或虚数部分是NaN,isnan(z)返回1。如果z的实数或虚数部分都是有限或Inf,isnan(z)返回0。例如:

>>a=[-2-1012]

>>isnan(1./a)

Warning:Dividebyzero.

ans=

00000

因为空矩阵为零维,所以对空矩阵寻址常常导致错误。函数find()表示了可产生空矩阵结果的一般情况。如果函数find()的空矩阵输出用于索引其他数组,所返回的值也将是空的。这样,空矩阵具有传播性质。例如:

>>x=pi*(1:4)

>>i=find(x>20)

>>y=2*x(i)

x=

3.14166.28329.424812.5664

i=

Emptymatrix:1-by-0

y=

Emptymatrix:1-by-0很清楚,当希望y具有有限维数和值时,可能发生运行错误。当执行一个操作或使用可返回空结果的函数时,逻辑函数isempty()有利于为空矩阵定义一个缺省值,这样可避免运行错误。语法如下:

TF=isempty(A):判断数组(矩阵)A是否空。如果A是一个空的数组,返回逻辑true(1),否则为逻辑false(0)。空数组至少有一个维度的大小为零,例如,0 × 0或0 × 5。

2.除数为0的处理

除数为0是MATLAB编程的调试和分析中经常遇到的问题,对该问题的解决,可以使程序开发事半功倍。例如:

>>x=(-3:3)/3

x=

-1.0000-0.6667-0.333300.33330.66671.0000

由于x的第4个元素为0,当把x作为除数进行除法运算时,就出现了除数为0的情况,MATLAB会发出除数为0的警告,并在该位置给出NaN的结果(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论