第6章 MATLAB程序設計.ppt_第1頁
第6章 MATLAB程序設計.ppt_第2頁
第6章 MATLAB程序設計.ppt_第3頁
第6章 MATLAB程序設計.ppt_第4頁
第6章 MATLAB程序設計.ppt_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第6章 MATLAB程序設計,MATLAB有兩種常用的工作方式, 交互式命令行操作方式, M文件的編程工作方式,6.1 M文件,M文件有兩種形式:腳本文件(Script File)和函數(shù)文件(Function File)。腳本文件通常用于執(zhí)行一系列簡單的MATLAB命令,運行時只需輸入文件名字,MATLAB就會自動按順序執(zhí)行文件中的命令;函數(shù)文件和腳本文件不同,它可以接受參數(shù),也可以返回參數(shù),在一般情況下,用戶不能靠單獨鍵入其文件名來運行函數(shù)文件,而必須由其他語句來調(diào)用,MATLAB的大多數(shù)應用程序都是由函數(shù)文件的形式給出的。,6.1.1 局部變量與全局變量,函數(shù)文件所定義的變量是局部變量,這

2、些變量獨立于其他函數(shù)的局部變量和工作空間的變量,即只能在該函數(shù)的工作空間引用,而不能在其它函數(shù)工作空間和命令工作空間引用。,如果某些變量定義成全局變量,就可以在整個MATLAB工作空間進行存取和修改,以實現(xiàn)共享。因此,定義全局變量是函數(shù)間傳遞信息的一種手段。 用命令global定義全局變量,其格式為: global A B C 習慣上我們可以將全局變量定義為大寫字母。,6.1.2 M文件的編輯與運行,新建文件: 單擊MATLAB的主界面的工具欄上的圖標; 在命令窗口輸入命令edit建立新文件,或輸入命令edit filename, 利用MATLAB主界面的File|New子菜單,再從右拉菜單中

3、選擇“M-file”項;,打開文件: 編輯文件: 保存文件,運行文件,l 在命令窗口輸入要運行的文件名即可開始運行,需要注意的是,在運行前,一定要先保存文件,否則運行的是保存前的程序。 l 如果在編輯器中完成編輯后需要直接運行,可以選擇編輯器的Debug|Save and Run選項(如果文件已經(jīng)保存過,該選頂則變?yōu)镽un)。 按F5鍵則保存程序并直接運行;如果是新建M文件,則彈出“保存文件”對話框,用戶保存文件后直接運行。,6.1.3 腳本文件,腳本文件是M文件中最簡單的一種,不需要輸入輸出參數(shù),用命令語句可以控制MATLAB命令工作空間的所有數(shù)據(jù)。在運行過程中,產(chǎn)生的所有變量均是命令工作空

4、間變量,這些變量一旦生成,就一直保存在內(nèi)存空間中,除非用戶運行clear命令將它們清除。,運行一個腳本文件等價于從命令窗口中順序運行文件里的命令。由于腳本文件只是一串命令的集合,因此只需像在命令窗口中輸入命令那樣,依次將命令編輯在腳本文件中即可。,例6. 1 編程計算向量元素的平均值。 % average_1.m 計算向量元素的平均值 x=input(輸入向量:x=); m,n =size(x); %判斷輸入量的大小 if(m=1)|(n=1)| (m=1) %判斷輸入量的大小 if(m=1)|(n=1)| (m=1) %計算向量x所有元素的平均值, z=1:99; average_2(z)

5、ans = 50,通常函數(shù)文件由以下幾個基本部分組成: (1)函數(shù)定義行:函數(shù)定義行由關鍵字function引導,指明這是一個函數(shù)文件,并定義函數(shù)名、輸入?yún)?shù)和輸出參數(shù),函數(shù)定義行必須為文件的第一個可執(zhí)行語句,函數(shù)名與文件名相同,可以是MATLAB中任何合法的字符。 函數(shù)文件可以帶有多個輸入和輸出參數(shù),如: function x,y,z=sphere(theta,phi,rho) 也可以沒有輸出參數(shù),如: function printresults(x),(2)H1行:H1行就是幫助文本的第一行,是函數(shù)定義行下的第一個注釋行,是供lookfor查詢時使用的。一般來說為了充分利用MATLAB的搜

6、索功能,在編制M文件時,應在H1行中盡可能多地包含該函數(shù)的特征信息。由于在搜索路徑上包含average的函數(shù)很多,因此用lookfor average可能會查詢到多個有關的命令。如: lookfor average_2 average_2.m: % 函數(shù)average_2(x)用以計算向量元素的平均值。,(3)幫助文本:在函數(shù)定義行后面,連續(xù)的注釋行不僅可以起到解釋與提示作用,更重要的是為用戶自己的函數(shù)文件建立在線查詢信息,以供help命令在線查詢時使用。如: help average_2 函數(shù)average_2(x)用以計算向量元素的平均值。 輸入?yún)?shù)x為輸入向量,輸出參數(shù)y為計算的平均值。

7、 非向量輸入將導致錯誤,(4)函數(shù)體:函數(shù)體包含了全部的用于完成計算及給輸出參數(shù)賦值等工作的語句,這些語句可以是調(diào)用函數(shù)、流程控制、交互式輸入/輸出、計算、賦值、注釋和空行。 (5)注釋:以%起始到行尾結束的部分為注釋部分,MATLAB的注釋可以放置在程序的任何位置,可以單獨占一行,也可以在一個語句之后,如: %非向量輸入將導致錯誤 m,n=size(x);%判斷輸入量的大小,6.1.5 函數(shù)調(diào)用,調(diào)用函數(shù)文件的一般格式為: 輸出參數(shù)表=函數(shù)名(輸入?yún)?shù)表) 調(diào)用函數(shù)時應注意: (1)當調(diào)用一個函數(shù)時,輸入和輸出參數(shù)的順序應與函數(shù)定義時的一致,其數(shù)目可以按少于函數(shù)文件中所規(guī)定的輸入和輸出參數(shù)調(diào)

8、用函數(shù),但不能使用多于函數(shù)文件所規(guī)定的輸入和輸出參數(shù)數(shù)目。例如: x,y=sin(pi) y=linspace(2),(2)在編寫函數(shù)文件調(diào)用時常通過nargin、nargout函數(shù)來設置缺省輸入?yún)?shù),并決定用戶所希望的輸出參數(shù)。函數(shù)nargin可以檢測函數(shù)被調(diào)用時用戶指定的輸入?yún)?shù)個數(shù);函數(shù)nargout可以檢測函數(shù)被調(diào)用時用戶指定的輸出參數(shù)個數(shù)。在函數(shù)文件中通過nargin、nargout函數(shù),可以適應函數(shù)被調(diào)用時,用戶輸入和輸出參數(shù)數(shù)目少于函數(shù)文件中function語句所規(guī)定數(shù)目的情況,以決定采用何種缺省輸入?yún)?shù)和用戶所希望的輸出參數(shù)。,function y = linspace(d1,

9、 d2, n) %LINSPACE Linearly spaced vector. if nargin = 2 n = 100; end n = double(n); y = d1+(0:n-2)*(d2-d1)/(floor(n)-1) d2;,(3)當函數(shù)有一個以上輸出參數(shù)時,輸出參數(shù)包含在方括號內(nèi)。例如,m,n=size(x)。注意:m,n在左邊表示函數(shù)的兩個輸出參數(shù)m和n;不要把它和m,n在等號右邊的情況混淆,如y=m,n表示數(shù)組y由數(shù)組m和n所組成。 (4)當函數(shù)有一個或多個輸出參數(shù),但調(diào)用時未指定輸出參數(shù),則不給輸出變量賦任何值。,function t=toc % TOC Read

10、 the stopwatch timer. Global TICTOC If nargout1 elapsed_time=etime(clock,TICTOC) else t=etime(clock,TICTOC); end,如果用戶調(diào)用toc時不指定輸出參數(shù)t,例如: tic toc elapsed_time = 4.0160 函數(shù)在命令窗口顯示函數(shù)工作空間變量elapsed_time的值,但在MATLAB命令工作空間里不給輸出參數(shù)t賦任何值,也不創(chuàng)建變量t。,如果如果用戶調(diào)用toc時指定輸出參數(shù)t,例如: tic out=toc out = 2.8140 則以變量out的形式返回到命令窗口

11、,并在MATLAB命令工作空間里創(chuàng)建變量out。,(5)函數(shù)有自己的獨立工作空間,它與MATLAB的工作空間分開。除非使用全局變量,函數(shù)內(nèi)變量與MATLAB其它工作空間之間唯一的聯(lián)系是函數(shù)的輸入和輸出參數(shù)。如果函數(shù)任一輸入?yún)?shù)值發(fā)生變化,其變化僅在函數(shù)內(nèi)出現(xiàn),不影響MATLAB其它工作空間的變量。函數(shù)內(nèi)所創(chuàng)建的變量只駐留在該函數(shù)工作空間,而且只在函數(shù)執(zhí)行期間臨時存在,以后就消失。因此,從一個調(diào)用到另一個調(diào)用,在函數(shù)工作空間以變量存儲信息是不可能的。,(6)在MATLAB其它工作空間重新定義預定義的變量(例如pi),它不會延伸到函數(shù)的工作空間;反之亦然,即在函數(shù)內(nèi)重新定義預定義的變量不會延伸到M

12、ATLAB的其它工作空間中。 (7)如果變量說明是全局的,函數(shù)可以與其它函數(shù)、MATLAB命令工作空間和遞歸調(diào)用本身共享變量。為了在函數(shù)內(nèi)或MATLAB命令工作空間中訪問全局變量,全局變量在每一個所希望的工作空間都必須說明。,(8)全局變量可以為編程帶來某些方便,但卻破壞了函數(shù)對變量的封裝,所以在實際編程中,無論什么時候都應盡量避免使用全局變量。如果一定要用全局變量,建議全局變量名要長、采用大寫字母,并有選擇地以首次出現(xiàn)的M文件的名字開頭,使全局變量之間不必要的互作用減至最小。 (9)MATLAB以搜尋腳本文件的同樣方式搜尋函數(shù)文件。例如,輸入cow,MATLAB首先認為cow是一個變量;如果

13、它不是,那么MATLAB認為它是一個內(nèi)置函數(shù);如果還不是,MATLAB檢查當前cow.m的目錄或文件夾;如果仍然不是,MATLAB就檢查cow.m在MATLAB搜尋路徑上的所有目錄或文件夾。,(10)從函數(shù)文件內(nèi)可以調(diào)用腳本文件。在這種情況下,腳本文件查看函數(shù)工作空間,不查看MATLAB命令工作空間。從函數(shù)文件內(nèi)調(diào)用的腳本文件不必調(diào)到內(nèi)存進行編譯,函數(shù)每調(diào)用一次,它們就被打開和解釋。因此,從函數(shù)文件內(nèi)調(diào)用腳本文件減慢了函數(shù)的執(zhí)行。 (11)當函數(shù)文件到達文件終點,或者碰到返回命令return,就結束執(zhí)行和返回。return命令提供了一種結束函數(shù)的簡單方法,而不必到達文件的終點。,6.2 MAT

14、LAB的程序控制結構,作為一種程序設計語言,MATLAB語言和其他的程序設計語言一樣,除了按正常順序執(zhí)行的程序結構外,還提供了各種控制程序流程的語句,如循環(huán)語句、條件語句、開關語句等??刂屏鞒虡O其重要,通過對流程控制語句的組合使用,可以實現(xiàn)多種復雜功能的程序設計,經(jīng)常出現(xiàn)在M文件中。,6.2.1 循環(huán)結構,在MATLAB中實現(xiàn)循環(huán)結構的語句有兩種:for循環(huán)語句和while循環(huán)語句,1. for 循環(huán),for循環(huán)允許一組命令以固定的和預定的次數(shù)重復。For循環(huán)的一般形式是: for 循環(huán)控制變量=表達式1:表達式2:表達式3 語句 end 在for循環(huán)語句中,循環(huán)體內(nèi)不能出現(xiàn)對循環(huán)控制變量的重

15、新設置,否則將會出錯;for循環(huán)允許嵌套使用。,例6. 3 求的值。 s=0; for n=1:10 s=s+n; end s,例6. 4 在區(qū)間2 ,0.75 內(nèi),以步長0.25,對函數(shù)y=f(x) = 1+1/x求值,并列表顯示。 r= ; s= ; for x= -2.0:0.25:-0.75 y=1+1/x; r=r x; s=s y; end r; s,使用for循環(huán)語句值得注意的是: (1)for循環(huán)不能用循環(huán)內(nèi)重新給循環(huán)變量賦值來終止。例如: x=0; for n=1:4 x =x+1 n=5; end,(2)for循環(huán)的循環(huán)變量= 表達式1:表達式2:表達式3,其實為一行向量,

16、例如:1:2:10= 0 2 4 6 8 10,它還可以是數(shù)組,其更一般的形式為: for 循環(huán)控制變量 = 數(shù)組表達式 語句 end,例6. 5 用for循環(huán)求行向量-2,5,3,6,-2各元素之和。 a=-2,5,3,6,-2; s=0; k=0; for n=a n%顯示每一次循環(huán)變量的值 k=k+1;%記錄循環(huán)次數(shù) s=s+n;%計算行向量a各元素之和 end k,s%顯示總的循環(huán)次數(shù)和計算結果,例6. 6 觀察下列程序的運行結果。 data=3 9 45 6; 7 16 -1 5 k=0; for n=data n%顯示每一次循環(huán)變量的值 k=k+1;%記錄循環(huán)次數(shù) x=n(1)-n

17、(2) end k,從例6.46.6的結果,大家可以看出,當循環(huán)變量為m1 m2 mn維數(shù)組x時,for循環(huán)的總循環(huán)次數(shù)為m2 mn,第i次循環(huán)時循環(huán)變量n的值為列向量x(i, j,k),j、k分別為第2n維的下標,從1m2,1mn依次變化。,(3)for循環(huán)可嵌套使用。,例6. 8 以for循環(huán)求1!+2!+10!的值。 s=0; for i=1:10 p=1; for j=1:i p=p*j; end s=s+p; end s,4)當有一個等效的數(shù)組方法來解給定的問題時,應避免用for循環(huán)。 例6. 9 比較下面兩段程序的執(zhí)行情況。 (a)for n=1:10 x(n)=sin(n*pi/

18、10); end x (b)n=1:10; x=sin(n*pi/10),(5)為了得到更快的速度,在for循環(huán)(while循環(huán))被執(zhí)行之前,應預先分配數(shù)組。如例6.9(a),在for循環(huán)內(nèi)每執(zhí)行一次命令,變量x的大小增加1,迫使MATLAB每進行一次循環(huán)都要花費時間對x分配更多的內(nèi)存。為了省去這個步驟,可以在例6.9(a)程序的首行加入: x=zeros(1,10); %為x分配內(nèi)存單元,2. while循環(huán),for循環(huán)的循環(huán)次數(shù)往往是固定的,而while循環(huán)可不定循環(huán)次數(shù),其一般形式為: while 關系表達式 語句 end 只要在表達式里的所有元素為真,就執(zhí)行while和end 語句之間

19、的“語句”。通常,表達式的求值給出一個標量值,但數(shù)組值也同樣有效。在數(shù)組情況下,所得到數(shù)組的所有元素必須都為真。,例6. 10 分析下列程序的功能。 num=0; EPS=1; while (1+EPS)1 EPS=EPS/2; num=num+1; end num=num-1 EPS=2*EPS,注意:for循環(huán)的循環(huán)變量為m1 m2 mn維數(shù)組,循環(huán)次數(shù)在一開始就由數(shù)組確定為m2 mn,所以在循環(huán)體內(nèi)并不能通過改變循環(huán)控制變量的值終止循環(huán);而while循環(huán)是先執(zhí)行循環(huán)體內(nèi)的語句,再判斷循環(huán)的條件是否成立,在循環(huán)體內(nèi)可以通過改變循環(huán)控制變量的值終止循環(huán)。,6.2.2 選擇結構,很多情況下,需

20、要根據(jù)不同的條件執(zhí)行不同的語句,在編程語言里,是通過選擇結構實現(xiàn)的。MATLAB的選擇結構語句有if語句、switch語句和try語句。,1. if語句,if語句的一般結構是: if 表達式 語句1 else 語句2 end,例6. 11 以for循環(huán)求容差變量eps。 EPS=1; for n=1:100 EPS=EPS/2; if (1+EPS)=1 EPS=EPS*2 break end end num = n -1,if語句可以嵌套使用,其結構形式為: if 表達式1 語句1 else If表達式2 語句2 else if 表達式n 語句n else 語句n+1 end end end

21、,if 表達式1 語句1 elseif 表達式2 語句2 elseif 表達式n 語句n else 語句n+1 end,試用for語句和if語句創(chuàng)建下列矩陣:,A= ; for k=1:5 for j=1:5 if k=j A(k,k)=5; elseif abs(k-j)=1 A(k,j)=1; else A(k,j)=0; end end end A,2. switch語句,switch語句的一般結構是: switch 表達式 case 表達式1 語句1 case 表達式2 語句2 . . case 表達式n 語句n otherwise 語句n+1 end,例6. 13 試用switch語

22、句完成卷面成績score的轉換: (1)score 90分,優(yōu);(2)90score 80分,良;(3)80score 70分,中;(4)70score 60分,及格;(5)60score,不及格。,score=input(請輸入卷面成績:score=); switch fix(score/10) case 9 grade=優(yōu) case 8 grade=良 case 7 grade=中 case 6 grade=及格 otherwise grade=不及格 end,3. try語句,try語句是MATLAB特有的語句,其一般結構是: try 語句1 catch 語句2 end 它先試探性地執(zhí)行

23、語句1,如果出錯,則將錯誤信息存入系統(tǒng)保留變量lasterr中,然后再執(zhí)行語句2;如果不出錯,則轉向執(zhí)行end后面的語句。此語句可以提高程序的容錯能力,增加編程的靈活性。,例6. 14 已知某圖像文件名為pic,但不知其存儲格式為.bmp還是.jpg,試編程正確讀取該圖像文件。 try picture=imread(pic.bmp,bmp); filename=pic.bmp; catch picture=imread(pic.jpg,jpg); filename=pic.jpg; end filename,6.2.3 程序流的控制,1. break語句 終止本層for或while循環(huán),跳轉到本層循環(huán)結束語句end的下一條語句。 2. return語句 終止被調(diào)用函數(shù)的運行,返回到調(diào)用函數(shù)。,3. pause語句 其調(diào)用格式有: (1)pause:暫停程序運行,按任意鍵繼續(xù); (2)pause(n):程序暫停運行n秒后繼續(xù); (3)pause on/off:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論