




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
MATLAB程序設計教學內(nèi)容M文件介紹函數(shù)流程控制函數(shù)變量調(diào)試程序優(yōu)化程序1M文件1.1M文件概述用MATLAB語言編寫的程序,稱為M文件。M文件可以根據(jù)調(diào)用方式的不同分為兩類:命令文件(ScriptFile)和函數(shù)文件(FunctionFile)。1.2M文件的建立與打開
M文件是一個文本文件,它可以用任何編輯程序來建立和編輯,而一般常用且最為方便的是使用MATLAB提供的文本編輯器。1.建立新的M文件
2.打開已有的M文件
函數(shù)式M文件比命令式M文件相對復雜一些,命令文件不需要自帶參數(shù),也不一定返回結(jié)果,而函數(shù)文件一般要自帶參數(shù),并且有返回結(jié)果,以便于更好的把整個程序連為一段。函數(shù)文件也可以不帶參數(shù),此時文件中一般使用一些全局變量來實現(xiàn)與外界和其他函數(shù)之間的數(shù)據(jù)交換。函數(shù)文件的第一行以function開始,說明此文件是一個函數(shù)。其實質(zhì)為用戶向MATLAB函數(shù)庫中添加的子函數(shù)。在默認情況下,函數(shù)文件中的變量都是局部變量,僅在函數(shù)運行期間有效,函數(shù)運行結(jié)束后,這些變量將從工作區(qū)中清除。函數(shù)文件的基本結(jié)構(gòu)函數(shù)文件由function語句引導,其基本結(jié)構(gòu)為:
function輸出形參表=函數(shù)名(輸入形參表)
注釋說明部分函數(shù)體語句其中以function開頭的一行為引導行,表示該M文件是一個函數(shù)文件。函數(shù)名的命名規(guī)則與變量名相同。輸入形參為函數(shù)的輸入?yún)?shù),輸出形參為函數(shù)的輸出參數(shù)。當輸出形參多于一個時,則應該用方括號括起來。例編寫函數(shù)文件求半徑為r的圓的面積和周長。函數(shù)文件如下:function[s,p]=fcircle(r)%CIRCLEcalculatetheareaandperimeterofacircleofradiir%r圓半徑%s圓面積%p圓周長s=pi*r*r;p=2*pi*r;
函數(shù)調(diào)用函數(shù)調(diào)用的一般格式是:
[輸出實參表]=函數(shù)名(輸入實參表)
要注意的是,函數(shù)調(diào)用時各實參出現(xiàn)的順序、個數(shù),應與函數(shù)定義時形參的順序、個數(shù)一致,否則會出錯。函數(shù)調(diào)用時,先將實參傳遞給相應的形參,從而實現(xiàn)參數(shù)傳遞,然后再執(zhí)行函數(shù)的功能。
例利用函數(shù)文件,實現(xiàn)直角坐標(x,y)與極坐標(ρ,θ)之間的轉(zhuǎn)換。函數(shù)文件tran.m:function[rho,theta]=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);
調(diào)用tran.m的命令文件main1.m:x=input('Pleaseinputx=:');y=input('Pleaseinputy=:');[rho,the]=tran(x,y);rhothe
例利用函數(shù)的遞歸調(diào)用,求n!。
n!本身就是以遞歸的形式定義的:顯然,求n!需要求(n-1)!,這時可采用遞歸調(diào)用。遞歸調(diào)用函數(shù)文件factor.m如下:functionf=factor(n)ifn<=1f=1;elsef=factor(n-1)*n;%遞歸調(diào)用求(n-1)!end在MATLAB中,函數(shù)可以嵌套調(diào)用,即一個函數(shù)可以調(diào)用別的函數(shù),甚至調(diào)用它自身。一個函數(shù)調(diào)用它自身稱為函數(shù)的遞歸調(diào)用。例分別建立命令文件和函數(shù)文件,將華氏溫度f轉(zhuǎn)換為攝氏溫度c。程序1:首先建立命令文件并以文件名f2c.m存盤。clear;%清除工作空間中的變量f=input('InputFahrenheittemperature:');c=5*(f-32)/9然后在MATLAB的命令窗口中輸入f2c,將會執(zhí)行該命令文件,執(zhí)行情況為:InputFahrenheittemperature:73c=22.7778程序2:首先建立函數(shù)文件f2c.m。functionc=f2c(f)c=5*(f-32)/9然后在MATLAB的命令窗口調(diào)用該函數(shù)文件。clear;y=input('InputFahrenheittemperature:');x=f2c(y)輸出情況為:InputFahrenheittemperature:70c=21.1111x=21.11112、函數(shù)流程控制順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)語句1.數(shù)據(jù)的輸入從鍵盤輸入數(shù)據(jù),則可以使用input函數(shù)來進行,該函數(shù)的調(diào)用格式為:
A=input(提示信息,選項);其中提示信息為一個字符串,用于提示用戶輸入什么樣的數(shù)據(jù)。如果在input函數(shù)調(diào)用時采用's'選項,則允許用戶輸入一個字符串。例如,想輸入一個人的姓名,可采用命令:xm=input('What''syourname?','s');2.1順序結(jié)構(gòu)MATLAB提供的命令窗口輸出函數(shù)主要有disp函數(shù),其調(diào)用格式為
disp(輸出項)其中輸出項既可以為字符串,也可以為矩陣。2.數(shù)據(jù)的輸出例輸入x,y的值,并將它們的值互換后輸出。程序如下:
x=input('Inputxplease.');y=input('Inputyplease.');z=x;x=y;y=z;disp(x);disp(y);例求一元二次方程ax2+bx+c=0的根。程序如下:a=input('a=?');b=input('b=?');c=input('c=?');d=b*b-4*a*c;x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);暫停程序的執(zhí)行可以使用pause函數(shù),其調(diào)用格式為:
pause(延遲秒數(shù))
如果省略延遲時間,直接使用pause,則將暫停程序,直到用戶按任一鍵后程序繼續(xù)執(zhí)行。若要強行中止程序的運行可使用Ctrl+C命令。3.程序的暫停1.if語句在MATLAB中,if語句有3種格式。
(1)單分支if語句:if條件語句組
end
當條件成立時,則執(zhí)行語句組,執(zhí)行完之后繼續(xù)執(zhí)行if語句的后繼語句,若條件不成立,則直接執(zhí)行if語句的后繼語句。2.2選擇結(jié)構(gòu)
(2)雙分支if語句:if條件語句組1else
語句組2end
當條件成立時,執(zhí)行語句組1,否則執(zhí)行語句組2,語句組1或語句組2執(zhí)行后,再執(zhí)行if語句的后繼語句。例計算分段函數(shù)的值。
程序如下:x=input('請輸入x的值:');ifx==10y=cos(x+1)+sqrt(x*x+1);elsey=x*sqrt(x+sqrt(x));enddisp(y);
(3)多分支if語句:if條件1
語句組1elseif條件2
語句組2……elseif條件m
語句組melse
語句組nend語句用于實現(xiàn)多分支選擇結(jié)構(gòu)。例輸入一個字符,若為大寫字母,則輸出其對應的小寫字母;若為小寫字母,則輸出其對應的大寫字母;若為數(shù)字字符則輸出其對應的數(shù)值,若為其他字符則原樣輸出。c=input('請輸入一個字符','s');ifc>='A'&c<='Z'disp(setstr(abs(c)+abs('a')-abs('A')));elseifc>='a'&c<='z'disp(setstr(abs(c)-abs('a')+abs('A')));elseifc>='0'&c<='9'disp(abs(c)-abs('0'));elsedisp(c);end2.switch語句
switch語句根據(jù)表達式的取值不同,分別執(zhí)行不同的語句,其語句格式為:
switch表達式
case表達式1
語句組1case表達式2
語句組2……case表達式m
語句組motherwise
語句組nend當表達式的值等于表達式1的值時,執(zhí)行語句組1,當表達式的值等于表達式2的值時,執(zhí)行語句組2,…,當表達式的值等于表達式m的值時,執(zhí)行語句組m,當表達式的值不等于case所列的表達式的值時,執(zhí)行語句組n。當任意一個分支的語句執(zhí)行完后,直接執(zhí)行switch語句的下一句。例根據(jù)變量num的值來決定顯示的內(nèi)容.num=input('請輸入一個數(shù)');switchnumcase-1disp('Iamateacher.');case0disp('Iamastudent.');case1disp('Youareateacher.');otherwisedisp('Youareastudent.');end3.try語句語句格式為:try
語句組1catch
語句組2endtry語句先試探性執(zhí)行語句組1,如果語句組1在執(zhí)行過程中出現(xiàn)錯誤,則將錯誤信息賦給保留的lasterr變量,并轉(zhuǎn)去執(zhí)行語句組2。例矩陣乘法運算要求兩矩陣的維數(shù)相容,否則會出錯。先求兩矩陣的乘積,若出錯,則自動轉(zhuǎn)去求兩矩陣的點乘。程序如下:A=[1,2,3;4,5,6];B=[7,8,9;10,11,12];tryC=A*B;catchC=A.*B;enddisp(C);disp(lasterr);%顯示出錯原因運行結(jié)果如下:
71627405572Errorusing==>mtimesInnermatrixdimensionsmustagree.1.for語句for語句的格式為:for循環(huán)變量=表達式1:表達式2:表達式3
循環(huán)體語句
end其中表達式1的值為循環(huán)變量的初值,表達式2的值為步長,表達式3的值為循環(huán)變量的終值。步長為1時,表達式2可以省略。2.3循環(huán)結(jié)構(gòu)例一個三位整數(shù)各位數(shù)字的立方和等于該數(shù)本身則稱該數(shù)為水仙花數(shù)。輸出全部水仙花數(shù)。程序如下:form=100:999m1=fix(m/100);%求m的百位數(shù)字m2=rem(fix(m/10),10);%求m的十位數(shù)字m3=rem(m,10);%求m的個位數(shù)字ifm==m1*m1*m1+m2*m2*m2+m3*m3*m3disp(m)endendfor語句更一般的格式為:
for循環(huán)變量=矩陣表達式循環(huán)體語句
end
執(zhí)行過程是依次將矩陣的各列元素賦給循環(huán)變量,然后執(zhí)行循環(huán)體語句,直至各列元素處理完畢。例寫出下列程序的執(zhí)行結(jié)果。
s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];fork=as=s+k;enddisp(s');程序運行結(jié)果為:39485766即分別求出矩陣每行元素之和。2.while語句
while語句的一般格式為:
while(條件)
循環(huán)體語句
end
其執(zhí)行過程為:若條件成立,則執(zhí)行循環(huán)體語句,執(zhí)行后再判斷條件是否成立,如果不成立則跳出循環(huán)。
例從鍵盤輸入若干個數(shù),當輸入0時結(jié)束輸入,求這些數(shù)的平均值和它們之和。程序如下:sum=0;cnt=0;val=input('Enteranumber(endin0):');while(val~=0)sum=sum+val;cnt=cnt+1;val=input('Enteranumber(endin0):');endif(cnt>0)summean=sum/cntend3.break語句和continue語句與循環(huán)結(jié)構(gòu)相關的語句還有break語句和continue語句。它們一般與if語句配合使用。break語句用于終止循環(huán)的執(zhí)行。當在循環(huán)體內(nèi)執(zhí)行到該語句時,程序?qū)⑻鲅h(huán),繼續(xù)執(zhí)行循環(huán)語句的下一語句。continue語句控制跳過循環(huán)體中的某些語句。當在循環(huán)體內(nèi)執(zhí)行到該語句時,程序?qū)⑻^循環(huán)體中所有剩下的語句,繼續(xù)下一次循環(huán)。例求[100,200]之間第一個能被21整除的整數(shù)。程序如下:forn=100:200ifrem(n,21)~=0continueendbreakenddisp(n)4.循環(huán)的嵌套如果一個循環(huán)結(jié)構(gòu)的循環(huán)體又包括一個循環(huán)結(jié)構(gòu),就稱為循環(huán)的嵌套,或稱為多重循環(huán)結(jié)構(gòu)。例3-13若一個數(shù)等于它的各個真因子之和,則稱該數(shù)為完數(shù),如6=1+2+3,所以6是完數(shù)。求[1,500]之間的全部完數(shù)。form=1:500s=0;fork=1:m/2ifrem(m,k)==0s=s+k;endendifm==sdisp(m);endend3.函數(shù)變量局部變量全局變量永久變量局部變量每個函數(shù)都有自己的局部變量,這些變量存儲在該函數(shù)獨立的工作區(qū)中,與其他函數(shù)的變量及主工作區(qū)中的變量分開存儲。當函數(shù)調(diào)用結(jié)束時,這些變量隨之刪除,不保存在內(nèi)存中。并且,除了函數(shù)返回值,該函數(shù)不改變工作區(qū)中其他變量的值。然而命令文件沒有獨立的工作區(qū),當通過命令窗口調(diào)用命令文件時,命令文件分享主工作區(qū),當函數(shù)調(diào)用命令文件時,命令文件分享主調(diào)函數(shù)的工作區(qū)。需要注意的是,如果命令文件中改變了工作區(qū)中變量的值,則在命令文件調(diào)用結(jié)束后,該變量的值發(fā)生改變。在函數(shù)中,變量默認為局部變量。全局變量局部變量只在一個工作區(qū)內(nèi)有效,無論是函數(shù)工作區(qū)還是MATLAB主工作區(qū)。與局部變量不同,全局變量可以在定義該變量的全部工作區(qū)中有效。當在一個工作區(qū)內(nèi)改變該變量的值時,該變量在其他工作區(qū)中的變量同時改變。任何函數(shù)如果需要使用全局變量,則必須首先聲明,聲明格式為:global變量名1變量名2如果一個M文件中包含的子函數(shù)需要訪問全局變量,則需在子函數(shù)中聲明該變量,如果需要在命令行中訪問該變量,則需在命令行中聲明該變量。例全局變量應用示例。先建立函數(shù)文件wadd.m,該函數(shù)將輸入的參數(shù)加權(quán)相加。functionf=wadd(x,y)globalALPHABETAf=ALPHA*x+BETA*y;
在命令窗口中輸入:globalALPHABETAALPHA=1;BETA=2;s=wadd(1,2)永久變量除局部變量和全局變量外,MATLAB中還有一種變量類型為永久變量。永久變量的特點為:只能在M文件內(nèi)部定義;只有該變量從屬的函數(shù)能夠訪問該變量;當函數(shù)運行結(jié)束時,該變量的值保留在內(nèi)存中,因此當該函數(shù)再次被調(diào)用時,可以再次利用這些變量。永久變量的定義方法為:persistent變量名1變量名2。
程序的調(diào)用(1)主函數(shù)(2)子函數(shù)(3)局部函數(shù)
M文件中的第一個函數(shù)就叫做主函數(shù),前邊章節(jié)中所引用的函數(shù)事實上都是主函數(shù),主函數(shù)之后可以是任意數(shù)量的子函數(shù),它們可以作為主程序的子程序.一般來說,在命令窗口或是其他的M文件只能調(diào)用主函數(shù),調(diào)用的時候就是直接調(diào)用其函數(shù)名.主函數(shù)比如,函數(shù)average的M文件average.m如下:functiony=average(x)%AVERAGEMeanofvectorelements.y=sum(x)/length(x);%Actualcomputation子函數(shù)
與其他的高級語言一樣,在MATLAB7語言中也可以很方便地定義子函數(shù),用來擴充函數(shù)的功能。在函數(shù)文件中題頭定義的函數(shù)為主函數(shù),而在函數(shù)體內(nèi)定義的其他函數(shù)都被視為子函數(shù)。子函數(shù)只能為主函數(shù)或同一主函數(shù)下的其他子函數(shù)所使用。(必須和相應的主函數(shù)放到同一目錄下!)例利用函數(shù)的遞歸調(diào)用,求n!.n!本身就是以遞歸的形式定義的:顯然,求n!需要求(n-1)!,這時可采用遞歸調(diào)用.遞歸調(diào)用函數(shù)文件factor.m如下:functionf=factor(n)ifn<=1f=1;elsef=factor(n-1)*n;%遞歸調(diào)用求(n-1)!end局部函數(shù)
MATLAB7語言中把放置在目錄private下的函數(shù)稱為局部函數(shù),這些函數(shù)只有private目錄的父目錄中的函數(shù)才可以調(diào)用,其他目錄下的函數(shù)不能調(diào)用.
局部函數(shù)與子函數(shù)所不同的是,局部函數(shù)可以被其父目錄下的所有函數(shù)所調(diào)用,而子函數(shù)則只能被其所在的M文件的主函數(shù)所調(diào)用.所以,局部函數(shù)在可用的范圍上大于子函數(shù);在函數(shù)編輯的結(jié)構(gòu)上,局部函數(shù)與一般的函數(shù)文件的編輯相同,而子函數(shù)只能在主函數(shù)文件中編輯.為防止程序調(diào)用出錯!調(diào)用MATLAB工具箱的程序的自編程序必須放到默認的work工作路徑當中.
課件中的程序如果直接拷貝到MATLAB中,部分不能直接運行,注意英文字符和漢語字符的區(qū)別!4.調(diào)試程序直接調(diào)試法利用調(diào)試工具采用命令行調(diào)試程序采用調(diào)試界面調(diào)試程序程序調(diào)試概述一般來說,應用程序的錯誤有兩類,一類是語法錯誤,另一類是運行時的錯誤。語法錯誤包括詞法或文法的錯誤,例如函數(shù)名的拼寫錯、表達式書寫錯等。程序運行時的錯誤是指程序的運行結(jié)果有錯誤,這類錯誤也稱為程序邏輯錯誤。直接調(diào)試法MATLAB語言具有強大的運算能力,指令系統(tǒng)簡單,因此程序通常非常簡潔。對于簡單的程序可以采用直接調(diào)試的方法。在程序調(diào)試時,程序運行中變量的值為一個重要的線索。因此,查看變量值為程序調(diào)試的重要線索,由于在函數(shù)調(diào)用時只返回最后的輸出參數(shù),而不返回中間變量,因此,可以選擇下面的方法查看程序運行中的變量值。(1)通過分析后,將可能出錯的語句后面的分號(;)刪除,將結(jié)果顯示在命令窗口中,與預期值進行比較;(2)利用函數(shù)disp顯示中間變量的值;(3)在程序中的適當位置添加keyboard指令。當MATLAB執(zhí)行至此處時將暫停,等待用戶反應。當程序運行至此時將暫停,在命令窗口中顯示k>>提示符,用戶可以查看工作區(qū)中的變量,可以改變變量的值。輸入return指定返回程序,繼續(xù)運行。(4)在調(diào)試一個單獨的函數(shù)時,可以將函數(shù)改寫為腳本文件,此時可以直接對輸入?yún)?shù)賦值,然后以腳本方式運行該M文件,這樣可以保存中間變量,在運行完成后,可以查看中間變量的值,對結(jié)果進行分析,查找錯誤所在。采用命令行調(diào)試程序函數(shù)功能dbstop設置斷點dbclear刪除斷點dbcont重新開始dbdown恢復由dbup修改的變量值dbmex啟動MEX文件調(diào)試dbstack列出調(diào)用關系dbstatus列出所有的斷點dbstep執(zhí)行一行或多行dbtype列出M文件并標出每行dbup修改工作區(qū)中變量的值dbquit退出調(diào)試模式函數(shù)功能echo顯示執(zhí)行的腳本或函數(shù)代碼disp顯示指定變量的值或者其他信息sprintf,fprintf格式化輸出不同類型的變量whos查看工作區(qū)中的變量size顯示數(shù)組維數(shù)keyboard中斷程序執(zhí)行,將控制權(quán)交給鍵盤,允許鍵盤輸入return在keyboard中斷后繼續(xù)返回程序執(zhí)行warning顯示指定的警告消息error顯示指定的錯誤消息lasterr返回最后一條錯誤消息lasterror返回最后一條錯誤消息及相關信息lastwarn返回最后一條警告消息文本編輯器中的Debug菜單提供了全部的調(diào)試選項,另外,MATLAB主窗口中的Debug菜單提供了一些調(diào)試命令,方便調(diào)試時在命令窗口中查看運行狀態(tài)。調(diào)試選項及其功能如表所示。選項功能對應快捷鍵OpenM-fileswhenDebbuging選擇該選項則在調(diào)試打開M文件無Step下一步F10StepIn進入被調(diào)用函數(shù)內(nèi)部F11StepOut跳出當前函數(shù)Shift+F11Continue執(zhí)行,直至下一斷點F5GountilCursor執(zhí)行至當前光標處無Set/ClearBreakpoint設置或刪除斷點F12Set/ModifyConditionalBreakpoint…設置或修改條件斷點無Enable/DisableBreakpoin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自動控制原理課程設計8
- 設備培訓方案 (一)
- 峨邊彝族自治縣教學質(zhì)量檢測八年級生物試題
- 貝克痣的心理影響評估工具開發(fā)
- Unit 10 Lesson 7 Reading for Writing 課件 2024-2025學年仁愛科普版英語七年級下冊
- 建筑施工特種作業(yè)-建筑架子工(普通腳手架)真題庫-7
- 日語考級教材題目及答案
- 2023-2024學年湖南省郴州市高二下學期期末教學質(zhì)量監(jiān)測數(shù)學試題(解析版)
- 2023-2024學年福建省寧德市高二下學期期末質(zhì)量檢測數(shù)學試題(解析版)
- (高清版)DB32∕T 4799-2024 地震預警信息發(fā)布
- 2025年浙江杭州錢塘區(qū)和達能源有限公司招聘筆試沖刺題(帶答案解析)
- 2025年衣物清潔多元化發(fā)展趨勢白皮書-天貓家清第一財經(jīng)商業(yè)數(shù)據(jù)中心
- 冷鏈物流園建設項目投融資與財務方案
- 2024統(tǒng)編版七年級道德與法治下冊期末測試卷(含答案)
- 酒店經(jīng)銷商合同協(xié)議書
- 轉(zhuǎn)讓釣場合同協(xié)議書
- 醫(yī)院感染教學課件
- 叉車考試試題模擬100題及答案
- 《全球教育資源庫》課件
- 2025年中考生物模擬測試卷及答案
- 慢性胃炎考試題及答案
評論
0/150
提交評論