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

下載本文檔

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

文檔簡介

1、第三章 MATLAB程序設計,3.1 M文件編輯器 3.2 M文件類型與運行機理 3.3 MATLAB程序控制流 3.4 M函數(shù)類型 3.5 M函數(shù)使用方法 3.6 數(shù)據(jù)I/O與文件操作 3.7 程序調(diào)試與性能優(yōu)化,3.1 M文件編輯器,M文件編輯器的啟動: 在MATLAB指令窗運行命令edit 點擊MATLAB工具欄上的“新建”圖標 在MATLAB菜單中選擇FileNew“M-file” 打開已經(jīng)存在的M文件: 在MATLAB指令窗運行命令edit filename 點擊MATLAB工具欄上的“打開”圖標 在MATLAB菜單中選擇FileOpen 編輯M文件: M文件是文本文件,后綴名必須是

2、.m M文件可以用任何文本編輯工具創(chuàng)建和編輯 文本編輯工具最好具有語法檢測功能,3.2 M文件類型與運行機制,3.2.1 M腳本文件 M腳本文件只是一串按用戶意圖排列而成的(包括控制流向指令在內(nèi)的)MATLAB指令集合 腳本文件運行后,所產(chǎn)生的所有變量都駐留在MATLAB基本工作空間中 只要用戶不使用clear指令加以清除,且MATLAB指令窗口不關(guān)閉,這些變量將一直保存在基本工作空間 基本工作空間隨MATLAB的啟動而產(chǎn)生,只有關(guān)閉MATLAB,該基本空間才能被刪除 腳本文件不允許有輸入?yún)?shù)和輸出參數(shù),3.2 M文件類型與運行機制,3.2.2 M函數(shù)文件 M函數(shù)文件的第一行是以functio

3、n引導的函數(shù)聲明行,該行還羅列函數(shù)與外界聯(lián)系的全部輸入輸出參數(shù) 每當函數(shù)文件運行時,MATLAB就專門為它開辟一個臨時的函數(shù)工作空間,所有中間變量都存放在函數(shù)工作空間中 當執(zhí)行完文件最后一條指令時,或遇到return,就結(jié)束該函數(shù)文件的運行,同時該臨時函數(shù)空間及其所有的中間變量就立即被刪除 函數(shù)空間隨具體M函數(shù)文件的被調(diào)用而產(chǎn)生,隨調(diào)用結(jié)束而刪除 函數(shù)空間相對基本空間是獨立的、臨時的,在MATLAB整個運行期間,可以產(chǎn)生任意多個臨時函數(shù)空間 如果在函數(shù)文件中發(fā)生對某腳本文件的調(diào)用,那么該腳本文件運行產(chǎn)生的所有變量都存放于函數(shù)空間,而不存放在基本空間 如果從組成程序結(jié)構(gòu)的角度來看,M函數(shù)文件僅比

4、M腳本文件多出一個函數(shù)聲明行,其它部分完全一樣,3.2 M文件類型與運行機制,3.2.3 M函數(shù)文件的一般結(jié)構(gòu) 函數(shù)聲明行: H1行: 在線幫助文本區(qū): 編寫和修改記錄: 函數(shù)體: 注釋:,function x=myfun(y) %MYFUN %我的第一個函數(shù) %調(diào)用格式: %x=myfun(y) %2009年4月14日編寫 %計算y的平方 x=y2;,3.2 M文件類型與運行機制,3.2.4 局部變量和全局變量 局部變量(Local variable) 存在于函數(shù)空間內(nèi)部的中間變量 產(chǎn)生于該函數(shù)的運行過程中 其影響范圍僅限于該函數(shù)本身 全局變量(Global variable) 不同的函數(shù)空

5、間以及基本工作空間共享的變量 每個希望共享變量的空間都必須用global聲明全局變量 沒采用global定義的空間無權(quán)享用全局變量 如果某個空間的操作使全局變量的內(nèi)容發(fā)生變化,那么其他空間中的同名變量也隨之變化 除非與全局變量聯(lián)系的所有空間都被刪除,否則全局變量依然存在 對全局變量的定義必須在該變量被使用之前進行 為了提高M文件的可讀性,建議用大寫字母命名全局變量 由于全局變量損害函數(shù)的封裝性,因此不提倡使用全局變量,3.2 M文件類型與運行機制,3.2.5 P碼文件 語法分析過程和偽代碼 一個M文件首次被調(diào)用時,MATLAB首先對該M文件進行語法分析,并把生成的相應內(nèi)部偽代碼文件存放在內(nèi)存中

6、 再次調(diào)用該M文件時,將直接調(diào)用該文件在內(nèi)存中的P碼文件,而不會對原碼文件重復進行語法分析 P碼文件與原碼文件有相同的文件名,但擴展名是.p P碼文件運行速度高于原碼文件 如果存在同名的P碼和原碼文件,那么當該文件名被調(diào)用時,被執(zhí)行的肯定是P碼文件 P碼文件的預生成 pcode FunName:在當前目錄上生成FunName.p pcode FunName inplace:在FunName.m所在目錄上生成FunName.p,3.2 M文件類型與運行機制,3.2.6 MATLAB的搜索過程 如果MATLAB在一個文件中遇到指令cow其搜索過程如下: 檢查cow是否為一個變量名;如果不是,執(zhí)行下

7、一步 檢查cow是否內(nèi)建函數(shù);假如不是,執(zhí)行下一步 檢查cow是不是cow所在的M文件中的一個子函數(shù);如果不是,再往下執(zhí)行 檢查cow是不是cow所在的M文件中的一個私有函數(shù);假如不是,再往下執(zhí)行 檢查cow是不是當前目錄上的文件;假如不是,再往下執(zhí)行 檢查搜索路徑上是否有cow存在 MATLAB將使用最先找到的那個cow 如果一直找不到cow,MATLAB就給出錯誤信息,3.3 MATLAB程序控制流,3.3.1 for循環(huán)控制結(jié)構(gòu) 格式: 說明: x:循環(huán)變量,依次取array各列 commands:循環(huán)體 重復執(zhí)行次數(shù)由array的列數(shù)決定 for循環(huán)結(jié)構(gòu)可以嵌套 array可以是任何合

8、法的MATLAB數(shù)組 循環(huán)不會因為在循環(huán)體內(nèi)對循環(huán)變量重新設置新值而中斷 為了得到高效代碼,應盡量提高代碼的向量化程度,而避免使用循環(huán)結(jié)構(gòu) 為了得到高效代碼,在循環(huán)指令之前應盡量對數(shù)組進行預定義,for xarray (commands) end,3.3 MATLAB程序控制流,3.3.2 while循環(huán)結(jié)構(gòu) 格式: 說明: commands:循環(huán)體 首先檢測expression的值,如其為邏輯真,則執(zhí)行循環(huán)體內(nèi)的命令,直到expression的值為邏輯假時退出循環(huán) 如果expression的值是數(shù)組,則只有在數(shù)組中所有元素均為真時才執(zhí)行循環(huán)體 while循環(huán)與for循環(huán)的區(qū)別是執(zhí)行循環(huán)體的次

9、數(shù)能否預先確定 如果expression的值為空數(shù)組,則MATLAB認為表達式值為假,而不執(zhí)行循環(huán)體,while expression (commands) end,3.3 MATLAB程序控制流,3.3.3 ifelseend分支結(jié)構(gòu) 格式: 一種選擇 兩種選擇 多種選擇 說明 表達式有時由多個邏輯子表達式組成,MATLAB將盡可能少地檢測這些子表達式的值 if指令判決和break指令的配合使用,可以強制終止for循環(huán)和while循環(huán),if expression (commands) end,if expression (commands) else (commands) end,if ex

10、pression1 (commands) elseif expression2 (commands) else (commands) end,3.3 MATLAB程序控制流,3.3.4 switch-case結(jié)構(gòu) 格式: 說明: ex應為標量或字符串 檢測值testk類型可以是標量或字符串,也可以是元胞數(shù)組 與C語言不同,在執(zhí)行完每個case塊后,MATLAB會自動跳出switch結(jié)構(gòu),無需使用break指令,switch ex case test1 (commands) case test2 case testk (commands) otherwise (commands) end,3.3

11、 MATLAB程序控制流,3.3.5 try-catch結(jié)構(gòu) 格式 說明: 只有當執(zhí)行命令組1出現(xiàn)錯誤后,命令組2才會被執(zhí)行 可調(diào)用lasterr函數(shù)查詢出錯原因 如果lasterr的運行結(jié)果是一個空串,則表明命令組1被成功執(zhí)行 當執(zhí)行命令組2時又出錯,MATLAB將終止該結(jié)構(gòu),try (commands1) catch (commands2) end,3.3 MATLAB程序控制流,3.3.6 其它常用指令 1.return:強制結(jié)束執(zhí)行函數(shù)并把控制轉(zhuǎn)出 2.input:將控制權(quán)“暫時”交給用戶 v=input(message):將用戶鍵入內(nèi)容賦給v v=input(message,s):將

12、用戶鍵入內(nèi)容作為字符串賦給v 3.keyboard:將控制權(quán)交給鍵盤 用戶可以輸入各種合法指令 用戶輸入return指令后控制權(quán)交還給程序 4.v=yesinput(Prompt,Default,Possib) 5.pause:暫停執(zhí)行文件,等待用戶按任意鍵繼續(xù) 6.break:使包含該指令的while、for循環(huán)終止 7.continue:結(jié)束當前循環(huán),開始下一次循環(huán) 8.error和warning指令: error(message):顯示出錯信息,終止程序 warning(message):顯示警告信息,程序繼續(xù)運行 errortrap:錯誤發(fā)生后,程序繼續(xù)執(zhí)行與否的雙位開關(guān),3.4 M函

13、數(shù)類型,3.4.1 子函數(shù)和私有函數(shù) 主函數(shù)與子函數(shù): 定義:M函數(shù)文件中第一個出現(xiàn)的函數(shù)稱為主函數(shù),該文件中的其他函數(shù)稱為子函數(shù) 保存時函數(shù)文件名與主函數(shù)定義名相同,外部函數(shù)只能調(diào)用主函數(shù) 主函數(shù)位置不可改變,子函數(shù)排列順序任意 子函數(shù)的優(yōu)先級僅次于內(nèi)建函數(shù) 主函數(shù)與子函數(shù)的工作空間彼此獨立 私有函數(shù): 定義:位于private目錄上的M函數(shù)文件 私有函數(shù)只能被private直接父目錄上的M文件調(diào)用 私有函數(shù)的優(yōu)先級次于子函數(shù),優(yōu)于其他類型的函數(shù) 子函數(shù)和私有函數(shù)不能直接被help、lookfor等指令搜索有關(guān)幫助信息,3.4 M函數(shù)類型,3.4.2 嵌套函數(shù) 在函數(shù)體內(nèi)部定義的函數(shù),包含M

14、文件的基本元素,以end表示結(jié)束 可以在一個函數(shù)內(nèi)部定義多個嵌套函數(shù),也可以使用多重嵌套 函數(shù)可以調(diào)用自己函數(shù)體中的嵌套函數(shù),但不能調(diào)用嵌套函數(shù)內(nèi)部更深層次的嵌套函數(shù) 同級函數(shù)可以相互調(diào)用,也可以調(diào)用比自己低一級的嵌套函數(shù) 嵌套函數(shù)擁有自己的工作空間,但是它有權(quán)限訪問其所嵌套地方的所有函數(shù)的工作空間 被主函數(shù)賦值的變量可以被主函數(shù)中任意一個嵌套函數(shù)訪問,嵌套函數(shù)的變量值也可以被任何包含它的函數(shù)訪問 由嵌套函數(shù)返回的變量不包含在外部函數(shù)中 使用函數(shù)句柄可以使得在函數(shù)的作用域之外也可以訪問這個函數(shù),但是函數(shù)的句柄必須在函數(shù)作用域內(nèi)被創(chuàng)建 嵌套函數(shù)在同一個M文件中與其他函數(shù)共享非全局變量,3.4 M

15、函數(shù)類型,3.4.3 內(nèi)聯(lián)函數(shù) 內(nèi)聯(lián)函數(shù)的創(chuàng)建: inline(CE):把串表達式轉(zhuǎn)化為輸入?yún)?shù)自動生成的內(nèi)聯(lián)函數(shù) inline(CE,arg1,arg2,):把串表達式轉(zhuǎn)化為arg1,arg2指定輸入?yún)?shù)的內(nèi)聯(lián)函數(shù) inline(CE,n):把串表達式轉(zhuǎn)化為x,P1,P2,Pn等指定參數(shù)的內(nèi)聯(lián)函數(shù) 涉及內(nèi)聯(lián)函數(shù)性質(zhì)的指令: class(inlinefun):給出內(nèi)聯(lián)函數(shù)類型 char(inlinefun):給出內(nèi)聯(lián)函數(shù)計算公式 argnames(inlinefun):給出內(nèi)聯(lián)函數(shù)的輸入?yún)?shù) vectorize(inlinefun):使內(nèi)聯(lián)函數(shù)適用“數(shù)組運算”規(guī)則,3.4 M函數(shù)類型,3.4.

16、4 匿名函數(shù) 語法格式及其說明: fhandle=(arglist)expression expression:函數(shù)體 arglist:輸入?yún)?shù)列表 使用方法: arglist可以是一個參數(shù),也可以是多個參數(shù) 匿名函數(shù)也可以沒有任何輸入?yún)?shù),但后面的括號必須保留 調(diào)用沒有輸入?yún)?shù)的匿名函數(shù)同樣要帶括號,否則MATLAB僅僅識別此句柄,而不會調(diào)用此函數(shù) 可以建立匿名函數(shù)數(shù)組,用元胞數(shù)組存儲 在函數(shù)定義中使用空格要慎重 與其他函數(shù)一樣,匿名函數(shù)返回的輸出參數(shù)個數(shù)決定于等號左邊的參數(shù)個數(shù),3.5 M函數(shù)使用方法,3.5.1 函數(shù)調(diào)用語法 命令行調(diào)用: 格式:funname in1 in2 inN 缺

17、點:不能為函數(shù)的返回參數(shù)賦值 函數(shù)式調(diào)用: 格式:out1,out2,outN=funname(in1,in2,inN) 輸入輸出參數(shù)都可以變化 命令/函數(shù)兩重性: 格式1:funname in1 in2 inN 格式2:funname(in1,in2,inN),3.5 M函數(shù)使用方法,3.5.2 輸入輸出參數(shù)檢測 檢測指令: nargin:在函數(shù)體內(nèi),用于獲取實際輸入?yún)?shù)數(shù)目 nargout:在函數(shù)體內(nèi),用于獲取實際輸出參數(shù)數(shù)目 nargin(fun):獲取fun指定函數(shù)的標稱輸入?yún)?shù)數(shù)目 nargin(fun):獲取fun指定函數(shù)的標稱輸出參數(shù)數(shù)目 inputname(n):在函數(shù)體內(nèi)使用

18、,給出第n個輸入?yún)?shù)的實際調(diào)用變量名 說明: 在函數(shù)體內(nèi)使用nargin、nargout的目的是與程序流控制指令配合,對于不同數(shù)目的輸入輸出參數(shù),函數(shù)可以完成不同的任務 nargin、nargout、inputname本身都是函數(shù),而不是變量,因此用戶不能使用賦值指令對它們進行處理,3.5 M函數(shù)使用方法,3.5.3 變長度輸入輸出參數(shù) 格式: 說明: varargin:變長度輸入?yún)?shù)列表 varargout:變長度輸出參數(shù)列表 varargin、varargout本身都是元胞數(shù)組 M函數(shù)文件被調(diào)用時,函數(shù)首先將輸入變量依先后順序逐個對應分配給列表中明確定義的普通輸入?yún)?shù),然后把剩余的輸入變量

19、依次逐個分配到varargin元胞數(shù)組的元胞中。 所謂變長度,就是varargin的長度隨分配到的輸入?yún)?shù)個數(shù)而變 在編寫M函數(shù)文件時,varargin的每個元胞應當作一個普通輸入?yún)?shù) varargout的工作機理、規(guī)則與varargin相同,function outpars,varargout=funname(inputpars,varargin),3.5 M函數(shù)使用方法,3.5.4 跨空間變量傳遞 跨空間計算串表達式的值 evalin(workspace,expression) evalin(workspace,expression1,expression2) workspace可取bas

20、e和caller 跨空間賦值 assign(workspace,VN,x),3.5 M函數(shù)使用方法,3.5.5 串演算函數(shù) eval指令: y=eval(CEM) y=eval(CEM1,CEM2) y1,y2=eval(CEM) CEM必須為字符串 CEM可以是MATLAB任何合法表達式 feval指令: y1,y2=feval(FN,arg1,arg2) FN只能是函數(shù)名 feval比eval運行效率高,3.5 M函數(shù)使用方法,3.5.6 函數(shù)句柄 函數(shù)句柄的創(chuàng)建和觀察 函數(shù)句柄創(chuàng)建: 利用符號,或利用轉(zhuǎn)換函數(shù)str2func 被創(chuàng)建句柄的函數(shù)文件必須在當前視野范圍內(nèi) 定義函數(shù)句柄時,所指

21、定的函數(shù)名不應包括路徑信息,也不應該包括擴展名 函數(shù)句柄內(nèi)涵觀察:functions functions函數(shù)只能接受(11)函數(shù)句柄數(shù)組, 返回一個單構(gòu)架,包含若干個域,以記錄函數(shù)的各種信息,3.5 M函數(shù)使用方法,函數(shù)句柄的用法 通過函數(shù)句柄執(zhí)行相應函數(shù)的計算 數(shù)值計算 符號計算 泛函指令調(diào)用 無效函數(shù)句柄 無效函數(shù)句柄的產(chǎn)生:如果函數(shù)不在當前視野內(nèi),所創(chuàng)建的函數(shù)句柄無效,此時MATLAB既不會發(fā)布“出錯”信息,也不會警告 class,size,who等指令只能表明函數(shù)句柄的存在,但無法判斷函數(shù)句柄的有效性 函數(shù)句柄的有效性可以用feval等指令檢驗,3.6 數(shù)據(jù)I/O與文件操作,3.6.1

22、 文件類型與相應操作 文本文件: MATLAB工作空間: MAT文件 逗號分隔的數(shù)字:csvread(fname.csv) 定界符分隔的文本:dlmread(fname.dlm) TAB鍵分隔的文本:dlmread(fname.tab) 科學數(shù)據(jù): 普通格式的數(shù)據(jù):cdfread(fname.cdf) 可變的圖像傳輸系統(tǒng)數(shù)據(jù):fitsread(fname.fits) 層次格式的數(shù)據(jù):hdfread(fname.hdf) 表單數(shù)據(jù): Excel表單:xlsread(fname.xls) Lotus123表單:wk1read(fname.wk1) 多媒體文件: 圖像:imread(fname.xx

23、x) 音頻:auread(fname.au),wavread(fname.wav) 視頻:aviread(fname.avi),3.6 數(shù)據(jù)I/O與文件操作,3.6.2 MAT文件及其操作 MAT文件的特點 MAT文件是MATLAB中特有的一種二進制文件 MAT文件是MATLAB與外部接口進行數(shù)據(jù)交換的媒介 MAT文件可以跨平臺使用 數(shù)據(jù)的導出 save:將MATLAB 工作空間所有變量存儲在當前目錄下的matlab.mat文件中 save var1 var2 varn:將n個變量保存在matlab.mat文件中 save fname var1 var2 varn:將n個變量保存在fname.

24、mat文件中 數(shù)據(jù)的導入 load:加載MATLAB找到的第一個matlab.mat文件中的所有變量到MATLAB工作空間中 load fname var1,var2,varn:加載fname.mat文件中的n個指定名稱的變量 判斷數(shù)據(jù)文件是否存在:exist(fname,file) 判斷數(shù)據(jù)文件中有哪些變量:whos file fname.mat 數(shù)據(jù)文件的刪除:delete fname.mat,3.6 數(shù)據(jù)I/O與文件操作,3.6.3 使用導入向?qū)В↖mport Wizard) 導入向?qū)У膯樱?命令行啟動:uiimport file 剪貼板導入數(shù)據(jù):uiimport pastespeci

25、al 菜單欄啟動:FileImport Data 導入文本文件: 行由文件的換行符劃分,列由用戶指定 分隔符類型:逗號、空格、制表符、分號、自定義 導入數(shù)據(jù)組成:data、textdata、rowheaders、colheaders 導入其他類型的文件,3.6 數(shù)據(jù)I/O與文件操作,3.6.4 Internet數(shù)據(jù)操作 MATLAB中的網(wǎng)頁操作: 導入網(wǎng)頁內(nèi)容:urlread 保存網(wǎng)頁文件:urlwrite 文件的壓縮與解壓: 壓縮文件:zip 解壓文件:unzip 電子郵件傳送與FTP訪問: 電子郵件傳送:sendmail FTP訪問:f=ftp(host,username,password

26、),3.6 數(shù)據(jù)I/O與文件操作,3.6.5 低級文件I/O 文件操作: 打開文件:fid=fopen(fname.xxx,s) 關(guān)閉文件:fclose(fid) 獲取文件狀態(tài):ferror 檢測文件是否終止:feof 定位文件:fseek 讀取文件數(shù)據(jù):fread 數(shù)據(jù)寫入文件:fwrite 數(shù)據(jù)格式化操作: 從文件中格式化讀取數(shù)據(jù):fscanf 將數(shù)據(jù)格式化寫入文件:fprintf 將數(shù)據(jù)格式化寫入字符串:sscanf 從字符串中格式化讀取數(shù)據(jù):sprintf,3.7 程序調(diào)試與性能優(yōu)化,3.7.1 編程時產(chǎn)生的錯誤(bug) 語法(Syntax)錯誤: 變量名、函數(shù)名的誤寫,標點符號的缺

27、漏等 MATLAB通常能在P碼編譯或運行時立即發(fā)現(xiàn),終止執(zhí)行,并給出相應的錯誤原因以及所在行號 運行(Runtime)錯誤: 由算法本身引起,發(fā)生在運行過程中,較難處理 運行錯誤來源于算法模型與期望目標是否一致,程序模型是否與算法一致 涉及用戶對期望目標原理的理解、對算法的理解 涉及用戶對MATLAB指令的理解、對程序流的理解和對MATLAB工作機理的理解 運行錯誤的表現(xiàn)形態(tài)較多 運行錯誤是動態(tài)錯誤,3.7 程序調(diào)試與性能優(yōu)化,3.7.2 直接調(diào)試法 將重點懷疑語句行、指令行后的分號“;”刪除或改為“,”,使計算結(jié)果顯示于屏幕 在適當?shù)奈恢锰砑语@示某些關(guān)鍵變量值的語句(包括使用disp在內(nèi)) 利用echo指令,使運行時在屏幕上逐行顯示文件內(nèi)容 在原M腳本文件或函數(shù)文件中的適當位置增添keyboard

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論