版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
MATLAB程序設(shè)計(jì)入門篇
程序流程控制16-1循環(huán)指令MATLAB提供兩種循環(huán)指令,一種是for循環(huán)(ForLoop),另一種是while循環(huán)(WhileLoop)。for循環(huán)的使用語法如下:for變數(shù)=向量, 表達(dá)式 end其中變量的值會被依次設(shè)定為向量的每一個元素值,來執(zhí)行介于for和end之間的表達(dá)式。另一種for循環(huán)的使用語法如下:for 變數(shù)=矩陣, 表達(dá)式 end此時變量的值會被依次設(shè)定為矩陣的每一個直行,來執(zhí)行介于for和end之間的表達(dá)式。while循環(huán)使用語法如下: while條件式 表達(dá)式; end程序流程控制之范例一下列for循環(huán)會產(chǎn)生一個長度為6的調(diào)和數(shù)列(HarmonicSequence):范例16-1:forLoop01.m x=zeros(1,6); %變數(shù)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循環(huán)中,變量i的值依次是1到6,因此矩陣x的第i個元素的值依次被設(shè)為1/i。我們接著可用分?jǐn)?shù)形式來顯示此數(shù)列: >>formatrat %使用分?jǐn)?shù)形式來顯式數(shù)值
>>disp(x)
11/21/31/41/51/6程序流程控制之范例二for循環(huán)可以是多層或巢狀式(Nested)的,在下例中即產(chǎn)生一個6×6的Hilbert矩陣h,其中為于第i列、第j行的元素為:范例16-2:forLoop02.m h=zeros(6); %變數(shù)x是一個6×6大小的零矩陣 fori=1:6 forj=1:6 h(i,j)=1/(i+j-1); end end formatrat %使用分?jǐn)?shù)形式來顯式所有數(shù)值 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循環(huán)列出先前產(chǎn)生的Hilbert矩陣的每一直行的平方和:范例16-3:forLoop01.m formatshort %回到預(yù)設(shè)形式來顯式所有數(shù)值 fori=h disp(norm(i)^2); %印出每一行的平方和 End 1.4914 0.5118 0.2774 0.1787 0.1262 0.0944在上例中,由于h是一個矩陣,因此每一次i的值就是矩陣h的一直行的內(nèi)容。程序流程控制之范例四若要跳出for循環(huán),可用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循環(huán)
end end 70!=1.197857e+100>1e100
程序流程控制之范例五在一個循環(huán)內(nèi)若要直接跳至到此循環(huán)下一回合的執(zhí)行,可使用continue指令。范例16-5:continue01.m x=[1-23-45]; posTotal=0; fori=1:length(x) ifx(i)<0,continue;end %若x(i)小于零,跳到此循環(huán)的下一回合
posTotal=posTotal+x(i); end posTotal %顯示posTotal的值 posTotal= 9上述范例中,我們計(jì)算向量x的正元素的總和,因此只要遇到x(i)是負(fù)數(shù),即可使用continue指令來直接跳到此循環(huán)的下一個回合來繼續(xù)執(zhí)行。Continue指令從MATLAB6.x才開始支持,若是使用MATLAB5.x,可用if–then–else來達(dá)到相同的功能。程序流程控制之范例六先前產(chǎn)生調(diào)和數(shù)列的例子,亦可用while循環(huán)改寫如下:范例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循環(huán)相同,在任何時刻若要跳出while循環(huán),亦可使用break指令;若要跳到下一回合的while循環(huán),也可以使用continue指令。無論是for或while循環(huán),均會降低MATLAB的執(zhí)行速度,因此盡量使用向量化的運(yùn)算(VectorizedOperations)而盡量少用循環(huán)。break指令若用在多重循環(huán)中,每次只跳出包含break指令的最內(nèi)部循環(huán)。16-2條件指令MATLAB支持二種條件指令(BranchingCommand,或中譯成「分支指令」),一種是if-then-else條件指令,另一種是MATLAB在第五版之后開始支持的switch-case-otherwise條件指令,以下分述之。最常用的條件指令是if-then-else,其使用語法為: if 條件式 表達(dá)式一; else
表達(dá)式二; end當(dāng)條件式成立時,MATLAB將執(zhí)行表達(dá)式一,否則,就執(zhí)行表達(dá)式二。若不需使用表達(dá)式二,則可直接省略else和表達(dá)式二。程序流程控制之范例八在數(shù)值運(yùn)算的過程中,若變量值為NaN(即NotANumber)時,我們要立刻印出警告訊息,可輸入如下例:范例16-8:if01.m x=0/0; ifisnan(x) disp('Warning:NaNdetected!'); end Warning:Dividebyzero.
… Warning:NaNdetected!在上例中,第一個警告訊息是MATLAB自動產(chǎn)生的,第二個警告訊息則是我們的程序代碼產(chǎn)生的,其中isnan(x)可用于判斷x是否為NaN,若是,則傳回1(真),否則即傳回0(偽)。程序流程控制之范例九在下例中,我們可根據(jù)向量y的元素值為奇數(shù)或偶數(shù),來顯示不同的訊息:范例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為雙向條件,亦即程序只會執(zhí)行「表達(dá)式一」或「表達(dá)式二」,不會有第三種可能。程序流程控制之范例十MATLAB亦可執(zhí)行多向條件,若要進(jìn)行更多向的條件,只需一再重復(fù)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為一數(shù)值或字符串,當(dāng)其值和value(k)相等時,MATLAB即執(zhí)行statement(k)并跳出switch指令。若expression不等于value(k),k=1,2,…,n-1,則MATLAB會執(zhí)行statement(n)并跳出switch指令。程序流程控制之范例十一欲根據(jù)月份來判斷其季別,可輸入如下:范例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之后比對多個字符串,就必需使用字符串的異值數(shù)組(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敘述內(nèi),每個case敘述需加上break以跳出該switch敘述,而在MATLAB則不必多此一舉。一般而言,switch–case–otherwise的執(zhí)行效率優(yōu)于if–then–else。LearningLoopsandLogic補(bǔ)充內(nèi)容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,其功能是可對輸入字符串進(jìn)行組合。例如,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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑裝修勞務(wù)分包合同范本
- 2024年小吃檔口的承包合同協(xié)議書
- 代理配股繳款協(xié)議專業(yè)版
- 家庭住宅客戶專用
- 正式授權(quán)加工合同書
- 房產(chǎn)中介銷售代理合同范例
- 電臺合作協(xié)議范本新
- 委托投資合同協(xié)議書模板
- 長期出租協(xié)議
- 改進(jìn)版用工合同格式
- 山西省運(yùn)城市2024-2025學(xué)年高二上學(xué)期10月月考英語試題
- 4.3《課間》 (教案)-2024-2025學(xué)年一年級上冊數(shù)學(xué)北師大版
- 【班主任工作】2024-2025學(xué)年秋季安全主題班會教育周記錄
- 2024-2030年街舞培訓(xùn)行業(yè)市場發(fā)展分析及發(fā)展趨勢前景預(yù)測報(bào)告
- 橡膠壩工程施工質(zhì)量驗(yàn)收評定表及填表說明
- 《2024版CSCO胰腺癌診療指南》更新要點(diǎn) 2
- +陜西省渭南市富平縣2023-2024學(xué)年九年級上學(xué)期摸底數(shù)學(xué)試卷
- 2023年法律職業(yè)資格《客觀題卷一》真題及答案
- 公司培訓(xùn)工作報(bào)告6篇
- 2024中國民航機(jī)場建設(shè)集團(tuán)限公司校園招聘304人高頻考題難、易錯點(diǎn)模擬試題(共500題)附帶答案詳解
- 血液透析患者安全管理應(yīng)急預(yù)案及處理課件
評論
0/150
提交評論