MATLAB程式设计入门篇程式流程控制_第1页
MATLAB程式设计入门篇程式流程控制_第2页
MATLAB程式设计入门篇程式流程控制_第3页
MATLAB程式设计入门篇程式流程控制_第4页
MATLAB程式设计入门篇程式流程控制_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

MATLAB程序设计入门篇

程序流程控制16-1循环指令MATLAB提供两种循环指令,一种是for循环(ForLoop),另一种是while循环(WhileLoop)。for循环的使用语法如下:for变数=向量, 表达式 end其中变量的值会被依次设定为向量的每一个元素值,来执行介于for和end之间的表达式。另一种for循环的使用语法如下:for 变数=矩阵, 表达式 end此时变量的值会被依次设定为矩阵的每一个直行,来执行介于for和end之间的表达式。while循环使用语法如下: while条件式 表达式; end程序流程控制之范例一下列for循环会产生一个长度为6的调和数列(HarmonicSequence):范例16-1:forLoop01.m x=zeros(1,6); %变数x是一个1×6大小的零矩阵 fori=1:6 x(i)=1/i; end x %显示x x= 1.00000.50000.33330.25000.20000.1667在上例中,矩阵x最初是一个1×6大小的零矩阵,在for循环中,变量i的值依次是1到6,因此矩阵x的第i个元素的值依次被设为1/i。我们接着可用分数形式来显示此数列: >>formatrat %使用分数形式来显式数值

>>disp(x)

11/21/31/41/51/6程序流程控制之范例二for循环可以是多层或巢状式(Nested)的,在下例中即产生一个6×6的Hilbert矩阵h,其中为于第i列、第j行的元素为:范例16-2:forLoop02.m h=zeros(6); %变数x是一个6×6大小的零矩阵 fori=1:6 forj=1:6 h(i,j)=1/(i+j-1); end end formatrat %使用分数形式来显式所有数值 h %显示h h= 11/21/31/41/51/6 1/21/31/41/51/61/7 1/31/41/51/61/71/8 1/41/51/61/71/81/9 1/51/61/71/81/91/10 1/61/71/81/91/101/11程序流程控制之范例三在下例中,for循环列出先前产生的Hilbert矩阵的每一直行的平方和:范例16-3:forLoop01.m formatshort %回到预设形式来显式所有数值 fori=h disp(norm(i)^2); %印出每一行的平方和 End 1.4914 0.5118 0.2774 0.1787 0.1262 0.0944在上例中,由于h是一个矩阵,因此每一次i的值就是矩阵h的一直行的内容。程序流程控制之范例四若要跳出for循环,可用break指令。例如,若要找出最小的n值,满足n!>10100,可输入如下:范例16-4:break01.m fori=1:1000 ifprod(1:i)>1e100 fprintf('%g!=%e>1e100\n',i,prod(1:i)); break; %跳出for循环

end end 70!=1.197857e+100>1e100

程序流程控制之范例五在一个循环内若要直接跳至到此循环下一回合的执行,可使用continue指令。范例16-5:continue01.m x=[1-23-45]; posTotal=0; fori=1:length(x) ifx(i)<0,continue;end %若x(i)小于零,跳到此循环的下一回合

posTotal=posTotal+x(i); end posTotal %显示posTotal的值 posTotal= 9上述范例中,我们计算向量x的正元素的总和,因此只要遇到x(i)是负数,即可使用continue指令来直接跳到此循环的下一个回合来继续执行。Continue指令从MATLAB6.x才开始支持,若是使用MATLAB5.x,可用if–then–else来达到相同的功能。程序流程控制之范例六先前产生调和数列的例子,亦可用while循环改写如下:范例16-6:while01.m x=zeros(1,6); i=1; whilei<=6 x(i)=1/i; i=i+1; end x %显示x x= 1.00000.50000.33330.25000.20000.1667程序流程控制之范例七若要用while指令找出最小的n值,使得n!>10100,可输入如下:范例16-7:while02.m n=1; whileprod(1:n)<1e100 n=n+1 end fprintf('%g!=%e>1e100\n',n,prod(1:n)); 70!=1.197857e+100>1e100与前述的for循环相同,在任何时刻若要跳出while循环,亦可使用break指令;若要跳到下一回合的while循环,也可以使用continue指令。无论是for或while循环,均会降低MATLAB的执行速度,因此尽量使用向量化的运算(VectorizedOperations)而尽量少用循环。break指令若用在多重循环中,每次只跳出包含break指令的最内部循环。16-2条件指令MATLAB支持二种条件指令(BranchingCommand,或中译成「分支指令」),一种是if-then-else条件指令,另一种是MATLAB在第五版之后开始支持的switch-case-otherwise条件指令,以下分述之。最常用的条件指令是if-then-else,其使用语法为: if 条件式 表达式一; else

表达式二; end当条件式成立时,MATLAB将执行表达式一,否则,就执行表达式二。若不需使用表达式二,则可直接省略else和表达式二。程序流程控制之范例八在数值运算的过程中,若变量值为NaN(即NotANumber)时,我们要立刻印出警告讯息,可输入如下例:范例16-8:if01.m x=0/0; ifisnan(x) disp('Warning:NaNdetected!'); end Warning:Dividebyzero.

… Warning:NaNdetected!在上例中,第一个警告讯息是MATLAB自动产生的,第二个警告讯息则是我们的程序代码产生的,其中isnan(x)可用于判断x是否为NaN,若是,则传回1(真),否则即传回0(伪)。程序流程控制之范例九在下例中,我们可根据向量y的元素值为奇数或偶数,来显示不同的讯息:范例16-9:if02.m y=[03416]; fori=1:length(y) ifrem(y(i),2)==0 fprintf('y(%g)=%giseven.\n',i,y(i)); else fprintf('y(%g)=%gisodd.\n',i,y(i)); end end y(1)=0iseven. y(2)=3isodd. y(3)=4iseven. y(4)=1isodd. y(5)=6iseven.上述的if-then-else为双向条件,亦即程序只会执行「表达式一」或「表达式二」,不会有第三种可能。程序流程控制之范例十MATLAB亦可执行多向条件,若要进行更多向的条件,只需一再重复elseif即可。例如,欲判断y向量之元素是属于3n、3n+1、或3n+2,可输入如下:范例16-10:if03.m y=[34592]; fori=1:length(y) ifrem(y(i),3)==0 fprintf('y(%g)=%gis3n.\n',i,y(i)); elseifrem(y(i),3)==1 fprintf('y(%g)=%gis3n+1.\n',i,y(i)); else fprintf('y(%g)=%gis3n+2.\n',i,y(i)); end end y(1)=3is3n. y(2)=4is3n+1. y(3)=5is3n+2. y(4)=9is3n. y(5)=2is3n+2.switch-case-otherwise指令MATLAB在第五版开始支持switch-case-otherwise的多向条件指令,其使用语法如下: switchexpression casevalue(1) statement(1) casevalue(2) statement(2) casevalue(n-1) statement(n-1) otherwise statement(n) end在上述语法中,expression为一数值或字符串,当其值和value(k)相等时,MATLAB即执行statement(k)并跳出switch指令。若expression不等于value(k),k=1,2,…,n-1,则MATLAB会执行statement(n)并跳出switch指令。程序流程控制之范例十一欲根据月份来判断其季别,可输入如下:范例16-11:switch01.m formonth=1:12 switchmonth case{3,4,5} season='Spring'; case{6,7,8} season='Summer'; case{9,10,11} season='Autumn'; case{12,1,2} season='Winter'; end fprintf('Month%d===>%s.\n',month,season); end Month1===>Winter. . . . . . . Month12===>Winter.程序流程控制之范例十二 如果expression是字符串,那么若要在case之后比对多个字符串,就必需使用字符串的异值数组(CellArreyofStrings):范例16-12:switch02.m month={'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep'}; fori=1:length(month) switchmonth{i} case{'Mar','Apr','May'} season='Spring'; case{'Jun','Jul','Aug'} season='Summer'; case{'Sep','Oct','Nov'} season='Autumn'; case{'Dec','Jan','Feb'} season='Winter'; end fprintf('%sis%s.\n',month{i},season); end程序流程控制之范例十二上述范例output如下: JanisWinter. FebisWinter. MarisSpring. AprisSpring. MayisSpring. JunisSummer. JulisSummer. AugisSummer. SepisAutumn.MATLAB的switch指令和C语言的switch指令略有差别:在C语言的switch叙述内,每个case叙述需加上break以跳出该switch叙述,而在MATLAB则不必多此一举。一般而言,switch–case–otherwise的执行效率优于if–then–else。LearningLoopsandLogic补充内容Ex9_1Summingaserieswithaforloops=0;%setavariableto0sothat1/n^2canberepeatedlyaddedtoitN=10000;%settheupperlimitofthesumforn=1:N%startoftheloop%add1/n^2toseachtime,thenputtheanswerbackintoss=s+1/n^2;end%endoftheloopfprintf(’Sum=%g\n’,s)%printtheanswer%calculatethesumofthesquaresofthereciprocalsofthe%integersfrom1to10,000n=1:10000;sum(1./n.^2)Ex9_2ProductswithaforloopP=1;%setthefirsttermintheproductN=20;%settheupperlimitoftheproductforn=2:N%starttheloopatn=2becausewealreadyloadedn=1P=P*n;%multiplybyneachtimeandputtheanswerbackintoPendfprintf(’N!=%g\n’,P)%printtheanswerfactorial(20)gamma(21)Ex9_3Recursionrelationswithforloopsa(1)=1;%putthefirstelementintothearrayN=19;%thefirstoneisloaded,solet’sload19moreforn=1:N%starttheloopa(n+1)=(2*n-1)/(2*n+1)*a(n);%therecursionrelationenddisp(a)%displaytheresultingarrayofvaluesEx9_4Logicclear;

a=1;b=3;%Ifthenumberaispositivesetcto1;ifais0ornegative

setcto0ifa>0

c=1else

c=0end%ifeitheraorbisnon-negative,addthemtoobtainc;%otherwisemultiplyaandbtoobtaincifa>=0|b>=0%eithernon-negative

c=a+belse

c=a*b%otherwisemultiplythemtoobtaincendEx9_5Secantmethodclear;closeall;%************************************%Definethefunctionasaninlinefunction%************************************func=inline(’exp(-x)-x’,’x’);%Firstplotthefunctionx=0:.01:2;f=func(x);plot(x,f,’r-’,x,0*x,’b-’)%************************************%Fromtheplotthesolutionisnearx=.6%Secantmethodtosolvetheexp(-x)-x=0%Useaninitialguessofx1=0.6%************************************x1=0.6;%findf(x1)f1=func(x1);%findanearbysecondguessx2=0.99*x1;%setchk,theerror,to1soitwon’ttrigger%thewhilebeforetheloopstartschk=1;%starttheloopwhilechk>1e-8%findf(x2)f2=func(x2);%findthenewxfromthestraightlineapproximationandprintitxnew=x2-f2*(x2-x1)/(f2-f1)%findchktheerrorbyseeinghowcloselyf(x)=0isapproximatedchk=abs(f2);%loadtheoldx2andf2intox1andf1;thenputthenewxintox2x1=x2;f1=f2;x2=xnew;endEx9_6Usingfzerofunctionf=fz(x)%evaluatethefunctionfz(x)whose%rootsarebeingsoughtf=exp(-x)-x;%****************************************%Hereisthematlabcodethatusesfz.mtofind%azerooff(x)=0neartheguessx=.7%Notethatthe@signisusedtotellMatlabthat%thenameofanM-fileisbeingpassedintofzero%***************************************x=fzero(@fz,.7)写一个MATLAB递归函式combine.m,其功能是可对输入字符串进行组合。例如,combine('abcd',2)所传回的字符串矩阵是ab

ac

ad

bc

bd

cd

此字符串矩阵的每一列代表从输入字符串任取两个字符时,所有可能的组合。functionout=combine(obj,n)% out=combine(obj,n)returnscombinations% ofobjwithndistinct

elements.% Forinstance:combine([12345],2)orcombine('abcde',3).%

ifn==1|n==length(obj),% out=obj(:);% return;%endifn==1, out=o

温馨提示

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

评论

0/150

提交评论