matlab程序设计课件,《MATLAB程序设计》PPT课件.ppt
《MATLAB程序設計》PPT課件.ppt
第3章 MATLAB程序設計 3.1 M文件 3.2 程序控制結構 3.3 函數文件 3.4 程序舉例 3.5 程序調試,3.1 M文件 3.1.1 M文件概述 用MATLAB語言編寫的程序,稱為M文件。M文件可以根據調用方式的不同分為兩類命令文件Script File和函數文件Function File。,例3-1 分別建立命令文件和函數文件,將華氏溫度f轉換為攝氏溫度c。 程序1 命令文件、腳本式文件 首先建立命令文件并以文件名f2c.m存盤。 clear; 清除工作空間中的變量 f Fahrenheit temperature; c5*f-32/9 然后在MATLAB的命令窗口中輸入f2c,將會執行該命令文件,執行情況為 Fahrenheit temperature73 c 22.7778,程序2(函數式文件) 首先建立函數文件f2c.m。 function cf2cf c5*f-32/9 然后在MATLAB的命令窗口調用該函數文件。 clear; y Fahrenheit temperature; xf2cy 輸出情況為 Fahrenheit temperature70 c 21.1111 x 21.1111,3.1.2 M文件的建立與打開 M文件是一個文本文件,它可以用任何編輯程序來建立和編輯,而一般常用且最為方便的是使用MATLAB提供的文本編輯器。 1建立新的M文件 1 菜單操作。從MATLAB主窗口的File菜單中選擇New菜單項,再選擇M-file命令,屏幕上將出現MATLAB 文本編輯器窗口。 2 命令操作。在MATLAB命令窗口輸入命令edit,啟動MATLAB文本編輯器后,輸入M文件的內容并存盤。 3 命令按鈕操作。單擊MATLAB主窗口工具欄上的New M-File命令按鈕,啟動MATLAB文本編輯器后,輸入M文件的內容并存盤。,2打開已有的M文件 1 菜單操作。從MATLAB主窗口的File菜單中選擇Open命令,則屏幕出現Open對話框,在Open對話框中選中所需打開的M文件。在文檔窗口可以對打開的M文件進行編輯修改,編輯完成后,將M文件存盤。 2 命令操作。在MATLAB命令窗口輸入命令edit 文件名,則打開指定的M文件。 3 命令按鈕操作。單擊MATLAB主窗口工具欄上的Open File命令按鈕,再從彈出的對話框中選擇所需打開的M文件。,3.2 程序控制結構 3.2.1 順序結構 1數據的輸入 從鍵盤輸入數據,則可以使用函數來進行,該函數的調用格式為 A提示信息,選項; 其中提示信息為一個字符串,用于提示用戶輸入什么樣的數據。 如果在函數調用時采用s選項,則允許用戶輸入一個字符串。例如,想輸入一個人的姓名,可采用命令 xmWhats your name,s;,2數據的輸出 MATLAB提供的命令窗口輸出函數主要有disp函數,其調用格式為 disp輸出項 其中輸出項既可以為字符串,也可以為矩陣。,例3-2 輸入x,y的值,并將它們的值互換后輸出。 程序如下 x x please.; y y please.; zx; xy; yz; dispx; dispy;,例3-3 求一元二次方程ax2 bxc0的根。 程序如下 aa; bb; cc; db*b-4*a*c; x-bsqrtd/2*a,-b-sqrtd/2*a; dispx1,num2strx1x2,num2strx2;,將數值型轉化為字符型,3程序的暫停 暫停程序的執行可以使用pause函數,其調用格式為 pause延遲秒數 如果省略延遲時間,直接使用pause,則將暫停程序,直到用戶按任一鍵后程序繼續執行。 若要強行中止程序的運行可使用CtrlC命令。,3.2.2 選擇結構 1if語句 在MATLAB中,if語句有3種格式。 1 單分支if語句 if 條件 語句組 end 當條件成立時,則執行語句組,執行完之后繼續執行if語句的后繼語句,若條件不成立,則直接執行if語句的后繼語句。,2 雙分支if語句 if 條件 語句組1 else 語句組2 end 當條件成立時,執行語句組1,否則執行語句組2,語句組1或語句組2執行后,再執行if語句的后繼語句。,例3-4 計算分段函數的值。 程序如下 x請輸入x的值; if x0 y xsqrtpi/exp2; else ylogxsqrt1x*x/2; end Y,3 多分支if語句 if 條件1 語句組1 elseif 條件2 語句組2 elseif 條件m 語句組m else 語句組n end 語句用于實現多分支選擇結構。,例3-5 輸入一個字符,若為大寫字母,則輸出其對應的小寫字母;若為小寫字母,則輸出其對應的大寫字母;若為數字字符則輸出其對應的數值,若為其他字符則原樣輸出。 c請輸入一個字符,s; if cA end,2switch語句 switch語句根據表達式的取值不同,分別執行不同的語句,其語句格式為 switch 表達式 case 表達式1 語句組1 case 表達式2 語句組2 case 表達式m 語句組m otherwise 語句組n end,當表達式的值等于表達式1的值時,執行語句組1,當表達式的值等于表達式2的值時,執行語句組2當表達式的值等于表達式m的值時,執行語句組m,當表達式的值不等于case所列的表達式的值時,執行語句組n。當任意一個分支的語句執行完后,直接執行switch語句的下一句。,例3-6 某商場對顧客所購買的商品實行打折銷售,標準如下商品價格用price來表示 price200 沒有折扣 200price500 3折扣 500price1000 5折扣 1000price2500 8折扣 2500price5000 10折扣 5000price 14折扣 輸入所售商品的價格,求其實際銷售價格。,程序如下 price請輸入商品價格; switch fixprice/100 case 0,1 價格小于200 rate0; case 2,3,4 價格大于等于200但小于500 rate3/100; case num2cell59 價格大于等于500但小于1000 rate5/100; case num2cell1024 價格大于等于1000但小于2500 rate8/100; case num2cell2549 價格大于等于2500但小于5000 rate10/100; otherwise 價格大于等于5000 rate14/100; end priceprice*1-rate 輸出商品實際銷售價格,3try語句 語句格式為 try 語句組1 catch 語句組2 end try語句先試探性執行語句組1,如果語句組1在執行過程中出現錯誤,則將錯誤信息賦給保留的lasterr變量,并轉去執行語句組2。,例3-7 矩陣乘法運算要求兩矩陣的維數相容,否則會出錯。先求兩矩陣的乘積,若出錯,則自動轉去求兩矩陣的點乘。 程序如下 A1,2,3;4,5,6; B7,8,9;10,11,12; try CA*B; catch CA.*B; end C lasterr 顯示出錯原因,3.2.3 循環結構 1for語句 for語句的格式為 for 循環變量表達式1表達式2表達式3 循環體語句 end 其中表達式1的值為循環變量的初值,表達式2的值為步長,表達式3的值為循環變量的終值。步長為1時,表達式2可以省略。,例3-8 一個三位整數各位數字的立方和等于該數本身則稱該數為水仙花數。輸出全部水仙花數。 程序如下 for m100999 m1fixm/100; 求m的百位數字 m2remfixm/10,10; 求m的十位數字 m3remm,10; 求m的個位數字 if mm1*m1*m1m2*m2*m2m3*m3*m3 dispm end end,例3-9 已知 ,當n100時,求y的值。 程序如下 y0; n100; for i1n yy1/2*i-1; end y,在實際MATLAB編程中,采用循環語句會降低其執行速度,所以前面的程序通常由下面的程序來代替 n100; i122*n-1; ysum1./i; y,for語句更一般的格式為 for 循環變量矩陣表達式 循環體語句 end 執行過程是依次將矩陣的各列元素賦給循環變量,然后執行循環體語句,直至各列元素處理完畢。,例3-10 寫出下列程序的執行結果。 s0; a12,13,14;15,16,17;18,19,20;21,22,23; for ka ssk; end disps;,2while語句 while語句的一般格式為 while 條件 循環體語句 end 其執行過程為若條件成立,則執行循環體語句,執行后再判斷條件是否成立,如果不成立則跳出循環。,例3-11 從鍵盤輸入若干個數,當輸入0時結束輸入,求這些數的平均值和它們之和。 程序如下 sum0; cnt0; valEnter a number end in 0; while val0 sumsumval; cntcnt1; valEnter a number end in 0; end if cnt 0 sum meansum/cnt end,3break語句、continue語句和return語句 continue命令也常與for或while命令一起使用,作用是結束本次循環,即跳過循環體中下面尚未執行的命令,接著進行下一次是否執行循環的判斷。當在循環體內執行到該語句時,程序將跳過循環體中所有剩下的語句,繼續下一次循環。 break命令經常與for和while等語句一起使用,其作用是跳出最內層循環。使用break命令可以不必等到循環的自然結束,而是根據條件,退出循環。 return命令能使當前正在運行的函數正常退出,并返回調用它的函數,繼續運行。,例3-12 求100,200之間第一個能被21整除的整數。 程序如下 for n100200 if remn,210 continue end break end n,4循環的嵌套 如果一個循環結構的循環體又包括一個循環結構,就稱為循環的嵌套,或稱為多重循環結構。 例3-13 若一個數等于它的各個真因子之和,則稱該數為完數,如6123,所以6是完數。求1,500之間的全部完數。 for m1500 s0; for k1m/2 if remm,k0 ssk; end end if ms dispm; end end,3.3 函數文件 3.3.1 函數文件的基本結構 函數文件由function語句引導,其基本結構為 function 輸出形參表函數名輸入形參表 注釋說明部分 函數體語句 其中以function開頭的一行為引導行,表示該M文件是一個函數文件。函數名的命名規則與變量名相同。輸入形參為函數的輸入參數,輸出形參為函數的輸出參數。當輸出形參多于一個時,則應該用方括號括起來。,例3-14 編寫函數文件求半徑為r的圓的面積和周長。 函數文件如下 function s,pfcircler CIRCLE calculate the area and perimeter of a circle of radii r r 圓半徑 s 圓面積 p 圓周長 2004年7月30日編 spi*r*r; p2*pi*r;,3.3.2 函數調用 函數調用的一般格式是 輸出實參表函數名輸入實參表 要注意的是,函數調用時各實參出現的順序、個數,應與函數定義時形參的順序、個數一致,否則會出錯。函數調用時,先將實參傳遞給相應的形參,從而實現參數傳遞,然后再執行函數的功能。 注意當存儲的函數文件名與函數名不一致時,調用時以函數文件名為準。,例3-15 利用函數文件,實現直角坐標x,y與極坐標,之間的轉換。 函數文件tran.m function rho,thetatranx,y rhosqrtx*xy*y; thetaatany/x; 調用tran.m的命令文件main1.m xPlease x; yPlease y; rho,thetranx,y; rho the 在MATLAB中,函數可以嵌套調用,即一個函數可以調用別的函數,甚至調用它自身。一個函數調用它自身稱為函數的遞歸調用。,例3-16 利用函數的遞歸調用,求n。 n本身就是以遞歸的形式定義的 顯然,求n需要求n-1,這時可采用遞歸調用。遞歸調用函數文件factor.m如下 function ffactorn if n1 f1; else ffactorn-1*n; 遞歸調用求n-1 end,3.3.3 函數參數的可調性 在調用函數時,MATLAB用兩個永久變量nargin和nargout分別記錄調用該函數時的輸入實參和輸出實參的個數。只要在函數文件中包含這兩個變量,就可以準確地知道該函數文件被調用時的輸入輸出參數個數,從而決定函數如何進行處理。,例3-17 nargin用法示例。 函數文件examp.m function foutcharraya,b,c if nargin1 fouta; elseif nargin2 foutab; elseif nargin3 fouta*b*c/2; end 命令文件mydemo.m x13; y1;2;3; exampx exampx,y exampx,y,3,3.3.4 全局變量與局部變量 函數文件中的變量是局部的,與其他函數文件及工作間相互隔離,即在一個函數文件中定義的變量不能被另一個函數文件引用。全局變量的作用域是整個工作間,所有函數都可以對它進行存儲和修改。 全局變量用global命令定義,格式為 global 變量名 例3-18 全局變量應用示例。 先建立函數文件wadd.m,該函數將輸入的參數加權相加。 function fwaddx,y global ALPHA BETA fALPHA*xBETA*y; 在命令窗口中輸入 global ALPHA BETA ALPHA1; BETA2; swadd1,2,定義全局變量是函 數間傳遞信息的一種手段,3.4 程序舉例 例3-19 猜數游戲。首先由計算機產生1,100之間的隨機整數,然后由用戶猜測所產生的隨機數。根據用戶猜測的情況給出不同提示,如猜測的數大于產生的數,則顯示“High”,小于則顯示“Low”,等于則顯示“You won”,同時退出游戲。用戶最多可以猜7次。,例3-20 用篩選法求某自然數范圍內的全部素數。 素數是大于1,且除了1和它本身以外,不能被其他任何整數所整除的整數。用篩選法求素數的基本思想是要找出2m之間的全部素數,首先在2m中劃去2的倍數不包括2,然后劃去3的倍數不包括3,由于4已被劃去,再找5的倍數 不包括5直到再劃去不超過的數的倍數,剩下的數都是素數。,例3-21 設 ,求 。 求函數fx在a,b上的定積分,其幾何意義就是求曲線yfx與直線xa,xb,y0所圍成的曲邊梯形的面積。為了求得曲邊梯形面積,先將積分區間a,b分成n等分,每個區間的寬度為hb-a/n,對應地將曲邊梯形分成n等分,每個小部分即是一個小曲邊梯形。近似求出每個小曲邊梯形面積,然后將n個小曲邊梯形的面積加起來,就得到總面積,即定積分的近似值。近似地求每個小曲邊梯形的面積,常用的方法有矩形法、梯形法以及辛普生法等。,例3-22 Fibonacci數列定義如下 f11 f21 fnfn-1fn-2 n2 求Fibonacci數列的第20項。 例3-23 根據矩陣指數的冪級數展開式求矩陣指數。,例3-24 求解雞兔同籠問題,雞與兔共100只,雞數被2除的商與兔數被4除的商之和為36,求雞和兔各由多少只 程序如下 i1 while 1 if rem100-2*i,40 end ii1 end disp雞的數目,num2str2*i disp兔的數目,num2str100-2*i,3.5 程序調試 3.5.1 程序調試概述 一般來說,應用程序的錯誤有兩類,一類是語法錯誤,另一類是運行時的錯誤。語法錯誤包括詞法或文法的錯誤,例如函數名的拼寫錯、表達式書寫錯等。 程序運行時的錯誤是指程序的運行結果有錯誤,這類錯誤也稱為程序邏輯錯誤。,3.5.2 調試器 1Debug菜單項 該菜單項用于程序調試,需要與Breakpoints菜單項配合使用。 2Breakpoints菜單項 該菜單項共有6個菜單命令,前兩個是用于在程序中設置和清除斷點的,后4個是設置停止條件的,用于臨時停止M文件的執行,并給用戶一個檢查局部變量的機會,相當于在M文件指定的行號前加入了一個keyboard命令。,3.5.3 調試命令 除了采用調試器調試程序外,MATLAB還提供了一些命令用于程序調試。命令的功能和調試器菜單命令類似,具體使用方法請讀者查詢MATLAB幫助文檔。,第4章 MATLAB文件操作 4.1 文件的打開與關閉 4.2 文件的讀寫操作 4.3 數據文件定位,二進制文件與文本文件的區別 一般地 1文本文件 TXT ,.DOC ,.RTF ,.PDT ,.WPS, .PWI ,DOT 2二進制文件 2. 文本模式textmode和二進制模式binarymode有什么區別 流可以分為兩種類型文本流和二進制流。文本流是解釋性的;二進制流是非解釋性的,一次處理一個字符,并且不轉換字符。 上述基礎其實大可以略過,簡言之,對用戶來說在 matlab 中存儲成為二進制還是文本文件取決于的方式,如果用wt,則存儲為文本文件,這樣用記事本打開就可以正常顯示了;如果用w則存儲為二進制文件,這樣用記事本打開會出現小黑方塊,要正常顯示的話,可以用寫字板或UltraEdit等工具打開。,4.1 文件的打開與關閉 4.1.1 文件的打開 函數的調用格式為 fid 文件名,打開方式 其中文件名用字符串形式(單引號)。 常見的打開方式有 r對打開的文件讀數據(已存在) r對打開的文件既可以讀數據。又可以寫數據(已存在) w對打開的文件寫數據, a在打開的文件末尾添加數據。 類似有r,a打開方式。 fid用于存儲文件句柄值,句柄值用來標識該數據文件,其他函數可以利用它對該數據文件進行操作。,文件數據格式有兩種形式,一是二進制文件,二是文本文件。在打開文件時需要進一步指定文件格式類型,即指定是二進制文件還是文本文件。 如 rt以只讀方式打開文本格式文件(t表示文本格式) rb打開可讀寫的二進制文件(b表示二進制文件) 注函數默認的是二進制文件。,4.1.2 文件的關閉 文件在進行完讀、寫等操作后,應及時關閉。關閉文件用fclose函數,調用格式為 stafclosefid 該函數關閉fid所表示的文件。sta表示關閉文件操作的返回代碼,若關閉成功,返回0,否則返回1。,4.2 文件的讀寫操作 4.2.1 二進制文件的讀寫操作 1讀二進制文件 fread 函數可以讀取二進制文件的數據,并將數據存入矩陣。其調用格式為 A,COUNTfreadfid,size, precision 其中A用于存放讀取的數據,COUNT返回所讀取的數據元素個數,fid為文件句柄,size為可選項,若不選用則讀取整個文件內容,若選用則它的值可以是下列值,1 N表示讀取 N個元素到一個列向量。 2 Inf表示讀取整個文件。 3 M,N表示讀數據到MN的矩陣中,數據按列存放。 precision代表讀寫數據的類型(P93,表41),2寫二進制文件 fwrite 函數按照指定的數據類型將矩陣中的元素寫入到文件中。其調用格式為 COUNTfwrite fid, A, precision 其中COUNT返回所寫的數據元素個數,fid為文件句柄,A用來存放寫入文件的數據,precision用于控制所寫數據的類型,其形式與fread函數相同。,例4-1 建立一數據文件magic5.dat,用于存放5階魔方陣。 程序如下 fidmagic5.dat,w; cntfwritefid,magic5,int32; fclosefid; fidmagic5.dat,r; B,cntfreadfid,5,inf,int32 fclosefid,4.2.2 文本文件的讀寫操作 1讀文本文件 fscanf 函數的調用格式為 A,COUNT fscanf fid, at, size 其中A用以存放讀取的數據,COUNT返回所讀取的數據元素個數。fid為文件句柄。at用以控制讀取的數據格式,由加上格式符組成,常見的格式符有d,f,c,s。 size為可選項,決定矩陣A中數據的排列形式。,2寫文本文件 fprintf 函數的調用格式為 COUNT fprintffid, at, A 其中A存放要寫入文件的數據。先按at指定的格式將數據矩陣A格式化,然后寫入到fid所指定的文件。格式符與fscanf函數相同。,例4-2文本文件的讀寫操作. x00.11; yx;expx; fidexp.txt,w; fprintffid,6.2f 12.8fn,y; 6.2f -控制x的值占6位,小數占2位; fclosefid 文本文件可以直接用type顯示其內容 Type exp.txt,4.3 數據文件定位 MATLAB提供了與文件定位操作有關的函數fseek和ftell。fseek函數用于定位文件位置指針,其調用格式為 statusfseekfid, offset, origin 其中fid為文件句柄,offset表示位置指針相對移動的字節數,origin表示位置指針移動的參照位置。取值為 cof文件的當前位置; bof文件的開始位置; eof文件的結束位置。 若定位成功,status返回值為0,否則返回值為1。,ftell函數返回文件指針的當前位置,其調用格式為 positionftell fid 返回值為從文件開始到指針當前位置的字節數。若返回值為1表示獲取文件當前位置失敗。,例4-3 下列程序執行后,變量four、position和three的值是多少 a15; fidfdat.bin,w; fwritefid,a,int16; statusfclosefid; fidfdat.bin,r; statusfseekfid,6,bof; fourfreadfid,1,int16; positionftellfid; statusfseekfid,-4,cof; threefreadfid,1,int16; statusfclsefid;,補充海量數據的導入導出技巧,load 和 save 命令 M loadsample_file.txt 加載文件sample_file.txt 到矩陣M save sample_file_plus5 M 將M保存到文件sample_file_plus5 中; save sample_file_plus5.txt M -ascii 將M保存到文本文件sample_file_plus5.txt,Importdata 讀有題頭、文本和數據的文件 D importdatasample_file2.txt, D importdatasample_file2.txt Textread 和 strread 讀文本或數值文件 c1 c2 c3 c4 textreadsample_file2.txt, s s s f ,headerlines,2 c2 c3 c4 textreadsample_file2.txt,s d d f,headerlines,3 Xlsread 用來讀取Excel的數值和文本文件,三. 具體例子分析 純數據(列數相同) 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186 解答對于這個txt文件,由于各行列數相同,故簡單地使用load, importdata均可。,2.字段名(中、英文字段均可)數據 CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 解答由于是記錄的形式,因此各行列數必相同(缺少部分列時請自行在文件中補上 Inf 或 NaN),故直接使用 importdata 便可。,3.注釋(含有獨立的數字串)數據(列數相同) 問題這個文件有4列,但前3行是文字說明,4列數字是從第4行開始的.現在我想把這個文件的前2列和文字說明提出來組成一個新的dat文件 源文件 Group 2 12.02.2006 Limei Samples of datas 50000 CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 解答由于注釋中含有獨立的數字串,且注釋部分沒有明顯的格式,這時候用importdata, load等高級命令直接讀取會失敗,用 textread, dlmwrite 等格式化命令也不太合適,因此只能使用低級命令進行讀取。(當然了,可以跳過注釋部分直接用高級命令讀取數據,即a b c d textreadfilename,f f f f,headerlines,4; )。,4. 注釋(不含獨立的數字串)數據(列數相同) 你好 abc 歡迎來到振動論壇 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 解答直接用 importdata 便可,5. 注釋與數據混排 CODE 1 11 111 1111 你好 2 22 222 2222 歡迎來到 3 33 333 3333 振動論壇 4 44 444 4444 5 55 555 5555 解答如果要求不高,也可以使用 textread 函數跳過注釋部分進行讀取,6.各列數據的分離 0 47038.7 1.05 092607 C 2 46477.7 1.03 092838 C 4 44865.7 1.04 092848 C 6 41786.4 1.03 092856 C 8 39896.0 0.97 092903 C 10 37518.4 0.93 092915 C 12 35858.5 0.92 092930 C 14 46105.0 1.03 093021 C 16 46168.6 6.89 093030 C 18 48672.3 4.33 093040 C 20 49565.7 0.49 093048 C 22 49580.7 0.53 093055 C 24 49602.3 0.84 093103 C 26 49582.5 1.51 093111 C 28 49577.0 1.39 093119 C 30 49589.3 0.61 093127 C 32 49578.3 1.06 093129 C 34 49512.5 1.77 093138 C 解答直接用 a,b,c,d,e,ftextreadyourfilename,d c f f s c; 便可,四. 注意事項 1. 請在 matlab 中保持當前路徑在該數據文件對應的目錄下進行存取,否則,存取時請給出該數據文件的具體路徑。 2. 存取時,請給出該數據文件的全稱(包括后綴名,讀取mat文件時可省略),
總結
以上是生活随笔為你收集整理的matlab程序设计课件,《MATLAB程序设计》PPT课件.ppt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Benchmark tool libra
- 下一篇: matlab幂指数函数图像,matlab