版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第四章第四章 MATLABMATLAB編程基礎(chǔ)編程基礎(chǔ)本章詳細講解利用M語言進行編程的方法講述的主要內(nèi)容:流程控制腳本文件函數(shù)文件子函數(shù)私有函數(shù)M文件的調(diào)試MATLABMATLAB編程基礎(chǔ)(續(xù))編程基礎(chǔ)(續(xù))4.1 概述4.2 流程控制4.3 腳本文件4.4 函數(shù)文件4.5 M文件調(diào)試4.6 M文件性能分析4.7 小結(jié)4.1 4.1 概述概述nMATLAB的工作模式 指令驅(qū)動模式 通常MATLAB以指令驅(qū)動模式工作,即在MATLABM命令行窗口下用戶輸入單行指令時, MATLAB立即處理這條指令,并顯示結(jié)果,這就是MATLAB命令行方式。 命令行方式程序可讀性差,而且不能存儲,當(dāng)處理復(fù)雜問題和
2、大量數(shù)據(jù)時很不方便。 M文件模式 將MATLAB語句構(gòu)成的程序存儲成以m為擴展名的文件,然后再執(zhí)行該程序文件,這種工作模式稱為程序文件模式。 程序文件不能在指令窗口下建立,因為指令窗口只允許一次執(zhí)行一行上的一個或幾個語句。概述(續(xù))概述(續(xù)) MATLAB通過M語言來實現(xiàn)完整的編寫應(yīng)用程序的能力 M語言 M語言是一種解釋性語言,利用該語言編寫的代碼 僅能被MATLAB接受,被MATLAB解釋、執(zhí)行。 M語言文件可以分為腳本文件和函數(shù)文件 一個M語言文件就是由若干MATLAB的命令組合在一 起構(gòu)成的。 M語言文件是標(biāo)準(zhǔn)的純文本格式的文件,其文件擴 展名為.m。 使用M文件可以將一組MATLAB命
3、令組合起來,通過 一個簡單的指令就可以執(zhí)行這些命令。概述(續(xù))概述(續(xù)) MATLAB提供了meditor編輯器編輯M文件 在MATLAB命令行窗口中鍵入指令edit,則可啟動 meditor編輯器 edit概述(續(xù))概述(續(xù)) 通過“File”菜單中的“New”子菜單下的“M-file”命令來啟 動meditor編輯器 直接單擊MATLAB用戶界面工具欄上的新建按鈕 來啟動meditor編輯器概述(續(xù))概述(續(xù)) M文件有兩類獨立的M文件 腳本(Scripts)可調(diào)用M文件 函數(shù)(Functions)MATLABMATLAB編程基礎(chǔ)(續(xù))編程基礎(chǔ)(續(xù))4.1 概述4.2 流程控制4.3 腳本
4、文件4.4 函數(shù)文件4.5 M文件調(diào)試4.6 M文件性能分析4.7 小結(jié)4.2 4.2 流程控制流程控制程序流程控制包含控制程序的基本結(jié)構(gòu)和語法 結(jié)構(gòu)化的程序主要有三種基本的程序結(jié)構(gòu)順序結(jié)構(gòu) 指所有組成程序源代碼的語句按照由上至下的次序依次執(zhí)行,直到程序的最后一個語句。選擇結(jié)構(gòu) 依照不同的判斷條件進行判斷,然后根據(jù)判斷的結(jié)果選擇某一種方法來解決某一個問題。循環(huán)結(jié)構(gòu) 就是在程序中某一條語句或多條語句重復(fù)多次的運行。MATLAB語言的程序結(jié)構(gòu)與其它高級語言是一致的,分為順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)流程控制(續(xù))流程控制(續(xù))4.2.1 選擇結(jié)構(gòu)4.2.2 循環(huán)結(jié)構(gòu)4.2.3 break語句和con
5、tinue語句4.2.4 提高運算性能4.2.1 4.2.1 選擇結(jié)構(gòu)選擇結(jié)構(gòu)當(dāng)判斷某一條件是否滿足,根據(jù)判斷的結(jié)果來選擇不同的解決方法時,就需要使用選擇結(jié)構(gòu)MATLAB的條件判斷可以使用if語句或者switch語句4.2.1 4.2.1 選擇結(jié)構(gòu)選擇結(jié)構(gòu) if語句if語句的三種基本語法結(jié)構(gòu)if(關(guān)系運算表達式) MATLAB語句 endif(關(guān)系運算表達式) MATLAB語句A else MATLAB語句B endif(關(guān)系運算表達式a) MATLAB語句A elseif (關(guān)系運算表達式b) MATLAB語句B else (關(guān)系運算表達式c) endif-elseif-els
6、e的語句結(jié)構(gòu)可以嵌套使用 if(關(guān)系運算表達式a) if (關(guān)系運算表達式b) MATLAB語句A else MATLAB語句B end else if (關(guān)系運算表達式c) MATLAB語句C else MATLAB語句D end end選擇結(jié)構(gòu)(續(xù))選擇結(jié)構(gòu)(續(xù)) switch語句switch語句用于處理多分支的選擇switch(表達式) case 常量表達式a:MATLAB語句A case 常量表達式b:MATLAB語句B case 常量表達式m:MATLAB語句M otherwise:MATLAB語句N end在MATLAB的switch語句中,程序僅僅執(zhí)行符合條件的ca
7、se分支如果需要對多個條件使用同一個case分支時,則需要使用元胞數(shù)組與之配合4.2.2 4.2.2 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)在MATLAB中,包含兩種循環(huán)結(jié)構(gòu)循環(huán)次數(shù)不確定的while循環(huán)循環(huán)次數(shù)確定的for循環(huán)循環(huán)結(jié)構(gòu)(續(xù))循環(huán)結(jié)構(gòu)(續(xù))1、while循環(huán)結(jié)構(gòu)while語句可以實現(xiàn)“當(dāng)”型的循環(huán)結(jié)構(gòu)格式 while(表達式) MATLAB語句 end特點是先判斷循環(huán)條件,當(dāng)循環(huán)條件成立,即表達式運算結(jié)果為“真”,再執(zhí)行循環(huán)體在循環(huán)過程中一定要有能夠改變關(guān)系表達式或者布爾類型變量的值循環(huán)結(jié)構(gòu)(續(xù))循環(huán)結(jié)構(gòu)(續(xù))2、for循環(huán)結(jié)構(gòu)使用for語句循環(huán)需要預(yù)先知道循環(huán)體執(zhí)行的次數(shù)格式 for index=
8、start:increment:end MATLAB語句 endindex的取值取決于start和end的值在for循環(huán)語句中,不僅可以使用行向量進行循環(huán)迭代的處理,也可以使用矩陣作為循環(huán)次數(shù)的控制變量循環(huán)的索引值將直接使用矩陣的每一列,循環(huán)的次數(shù)為矩陣的列數(shù)4.2.3 break4.2.3 break語句和語句和continuecontinue語句語句break語句和continue語句的基本功能當(dāng)break語句使用在循環(huán)體中的時候,其作用是能夠在執(zhí)行循環(huán)體的時候強迫終止循環(huán),即控制程序的流程,使其提前退出循環(huán)使用方法: break;continue語句出現(xiàn)在循環(huán)體中的時候,其作用是能夠中斷
9、本次的循環(huán)體運行,將程序的流程跳轉(zhuǎn)到判斷循環(huán)條件的語句處,繼續(xù)下一次的循環(huán)使用方法: continue;4.2.4 4.2.4 提高運算性能提高運算性能M語言和其他的高級語言不同,由于采用了解釋型語言,其執(zhí)行效率低于編譯性語言提高運算性能向量化運算預(yù)分配存儲空間MATLAB加速器提高運算性能(續(xù))提高運算性能(續(xù))1、向量化運算向量化運算不要使用循環(huán)結(jié)構(gòu)操作矩陣的元素,應(yīng)直接使用矩陣元素的索引或者矩陣運算的函數(shù),即盡量將使用while循環(huán)或者for循環(huán)的語句結(jié)構(gòu)轉(zhuǎn)換成等價的向量或者矩陣運算提高運算性能(續(xù))提高運算性能(續(xù))2、預(yù)分配存儲空間進行內(nèi)存變量存儲空間的預(yù)分配內(nèi)存預(yù)分配函數(shù)數(shù)據(jù)類型函
10、數(shù)例子數(shù)值數(shù)組zerosY=zeros(1,10000)元胞數(shù)組cellY=cell(2,3)Y1,3=zeros(1:10000)Y2,3=string結(jié)構(gòu)數(shù)組struct、repmatY=repmat(struct(field,value),2,3)提高運算性能(續(xù))提高運算性能(續(xù))例4-11disp(char(10),使用內(nèi)存預(yù)分配:)pre_allo=zeros(10000,1);ticfor I=1:10000 pre_allo(I)=rand(1);endtocdisp(char(10),不使用內(nèi)存預(yù)分配:)ticfor J=1:10000 not_pre_allo(J)=ran
11、d(1);endtoc提高運算性能(續(xù))提高運算性能(續(xù))使用內(nèi)存預(yù)分配MATLAB自動分配10000個連續(xù)的內(nèi)存空間用于存儲數(shù)據(jù),MATLAB將一次創(chuàng)建足夠的存儲空間,然后依次賦值不使用內(nèi)存預(yù)分配當(dāng)I=1時,MATLAB將使用一塊長度為一個單元大小的內(nèi)存保存第一個隨機數(shù)當(dāng)I=2時,MATLAB將尋找一塊兩單元大小的內(nèi)存區(qū),一個單元保存第一個隨機數(shù),第二個單元存放另一個隨機數(shù) 當(dāng)I=10000時,MATLAB尋找一塊容納10000單元的內(nèi)存存放以前的9999個隨機數(shù),同時把最新的一個隨機數(shù)加入進去提高運算性能(續(xù))提高運算性能(續(xù))3、MATLAB加速器MATLAB性能加速器能夠明顯改善循環(huán)結(jié)
12、構(gòu)、內(nèi)建函數(shù)調(diào)用等方面的運行效率。有些M語言元素不能被MATLAB性能加速器加速MATLABMATLAB編程基礎(chǔ)(續(xù))編程基礎(chǔ)(續(xù))4.1 概述4.2 流程控制4.3 腳本文件4.4 函數(shù)文件4.5 M文件調(diào)試4.6 M文件性能分析4.7 小結(jié)4.3 M4.3 M腳本文件腳本文件n包含MATLAB語言代碼的文件稱為 M文件,其擴展名為.m。n腳本文件就是由一系列的MATLAB指令和命令組成的純文本格式的M文件。n腳本文件沒有輸入?yún)?shù),也沒有輸出參數(shù)。n執(zhí)行腳本文件時,文件中的指令或者命令按照出現(xiàn)在腳本文件中的順序依次執(zhí)行。M M腳本文件(續(xù))腳本文件(續(xù))腳本文件示例% 注釋行% M文件示例%
13、 “flower petal”% 以下為代碼行% 計算theta=-pi:0.01:pi;rho(1,:)=2*sin(5*theta).2;rho(2,:)=cos(10*theta).3;rho(3,:)=sin(theta).2;rho(4,:)=5*cos(3.5*theta).3;for k=1:4 % 圖形輸出 subplot(2,2,k) polar(theta,rho(k,:)enddisp(程序運行結(jié)束!) 在腳本文件中,主要由注釋行 和代碼行組成 M文件的注釋行需要使用 %定義符注釋定義符僅能影響一行代碼 M文件的代碼行是一些簡 單的MATLAB指令或命令 命令可以完成相應(yīng)
14、的計算處理數(shù)據(jù)、繪制圖形結(jié)果的操作 可以在腳本文件中調(diào)用其他的函數(shù)完成復(fù)雜的數(shù)學(xué)運算M M腳本文件(續(xù))腳本文件(續(xù))在MATLAB命令行中運行該腳本文件: script_examp程序運行結(jié)束!MATLAB會出現(xiàn)相應(yīng)的圖形窗體MATLABMATLAB編程基礎(chǔ)(續(xù))編程基礎(chǔ)(續(xù))4.1 概述4.2 流程控制4.3 腳本文件4.4 函數(shù)文件4.5 M文件調(diào)試4.6 M文件性能分析4.7 小結(jié)4.4 4.4 函數(shù)文件函數(shù)文件M語言函數(shù)文件能夠接受用戶的輸入?yún)?shù),進行計算,并將計算結(jié)果作為函數(shù)的返回值返回給調(diào)用者在MATLAB中具有不同類型的函數(shù)文件內(nèi)建函數(shù)文件系統(tǒng)M函數(shù)文件系統(tǒng)MEX函數(shù)文件用戶自
15、定義MEX函數(shù)文件用戶自定義的M函數(shù)文件函數(shù)文件(續(xù))函數(shù)文件(續(xù))MATLAB的內(nèi)建函數(shù)文件MATLAB自定義的函數(shù)文件稱內(nèi)置函數(shù)文件。調(diào)用內(nèi)置函數(shù)的方法:使用函數(shù)名并給出相應(yīng)的入口、出口參數(shù)即可。 例如:sin.m函數(shù) 調(diào)用格式:y=sin(2*x)指令驅(qū)動模式 例: x=0 : 2*pi/180 : 2*pi; y=sin(2*x); plot(x,y)M文件模式假設(shè)存儲的文件名為nzhswj.m nzhswj用戶自定義的M函數(shù)文件是由用戶自己利用M語言編寫的文件系統(tǒng)M函數(shù)文件是由MATLAB提供的M語言函數(shù)文件函數(shù)文件(續(xù))函數(shù)文件(續(xù))本節(jié)介紹4.4.1 基本結(jié)構(gòu)4.4.2 輸入輸出
16、參數(shù)4.4.3 子函數(shù)和私有函數(shù)4.4.4 局部變量和全局變量4.4.5 函數(shù)執(zhí)行規(guī)則函數(shù)文件(續(xù))函數(shù)文件(續(xù))M語言函數(shù)文件具有下面的不同部分函數(shù)定義行在線幫助注釋行M語言代碼4.4.1 4.4.1 基本結(jié)構(gòu)基本結(jié)構(gòu)函數(shù)m文件的格式: function 返回變量 = 函數(shù)名(輸入變量) 注釋說明語句段 程序語句段特定規(guī)則:1) 函數(shù)m文件第一行必須以單詞function作為引導(dǎo)詞,必須遵循如下形式: function =()2) 程序中的變量均為局部變量,不保存在工作空間中,其變量只在函數(shù)運行期間有效。基本結(jié)構(gòu)(續(xù))基本結(jié)構(gòu)(續(xù))001 function y=average(x)002 %
17、 AVERAGE 求向量元素的均值003 % 語法:004 % Y=average(X)005 % 其中,X是向量,Y為計算得到向量元素的均值006 % 若輸入?yún)?shù)為非向量則出錯007008 % 代碼行009 m,n=size(x)010 % 判斷輸入?yún)?shù)是否為向量011 if(m=1)|(n=1)|(m=1&n=1)012 % 若輸入?yún)?shù)不是向量,則出錯013 error(Input must be a vector)014 end015 % 計算向量元素的均值016 y=sum(x)/length(x)基本結(jié)構(gòu)(續(xù))基本結(jié)構(gòu)(續(xù))函數(shù)定義行001 function y=average(x)
18、包括關(guān)鍵字function 函數(shù)輸出參數(shù)y 函數(shù)名稱average 函數(shù)輸入?yún)?shù)x函數(shù)名稱定義要求必須以字符開頭,后面可以用字符、數(shù)字和下劃線的組合構(gòu)成函數(shù)名稱MATLAB對函數(shù)名稱的長度有限定函數(shù)的M文件名稱最好和函數(shù)名稱保持一致,若不一致,則調(diào)用函數(shù)時需要使用文件名稱而非函數(shù)名稱基本結(jié)構(gòu)(續(xù))基本結(jié)構(gòu)(續(xù))在線幫助M函數(shù)文件的在線幫助為緊隨在函數(shù)定義行的注釋行002 % AVERAGE 求向量元素的均值003 % 語法:004 % Y=average(X)005 % 其中,X是向量,Y為計算得到向量元素的均值006 % 若輸入?yún)?shù)為非向量則出錯基本結(jié)構(gòu)(續(xù))基本結(jié)構(gòu)(續(xù))若在MATLAB命
19、令行窗口中鍵入指令help average 則 help average AVERAGE 求向量元素的均值 語法: Y=average(X) 其中,X是向量,Y為計算得到向量元素的均值 若輸入?yún)?shù)為非向量則出錯基本結(jié)構(gòu)(續(xù))基本結(jié)構(gòu)(續(xù))若在MATLAB命令行窗口中鍵入指令lookfor average 則 lookfor average AVERAGE 求向量元素的均值MEAN Average or mean value.MOVAVG Leading and lagging moving averages chart. MBSWAL Weighted Average Life of mort
20、gage pool.由于H1幫助行的特殊作用,所以在用戶自己定義M函數(shù)文件時,一定要編寫相應(yīng)的H1幫助行,對函數(shù)進行簡明、扼要的說明或解釋基本結(jié)構(gòu)(續(xù))基本結(jié)構(gòu)(續(xù))注釋行008 % 代碼行010 % 判斷輸入?yún)?shù)是否為向量012 % 若輸入?yún)?shù)不是向量,則出錯015 % 計算向量元素的均值注釋行不會顯示在在線幫助中,主要原因是這些注釋行沒有緊隨在H1幫助行的后面基本結(jié)構(gòu)(續(xù))基本結(jié)構(gòu)(續(xù))M語言代碼008 % 代碼行009 m,n=size(x)010 % 判斷輸入?yún)?shù)是否為向量011 if(m=1)|(n=1)|(m=1&n=1)012 % 若輸入?yún)?shù)不是向量,則出錯013 error(I
21、nput must be a vector)014 end015 % 計算向量元素的均值016 y=sum(x)/length(x)代碼行需要完成具體的算法,實現(xiàn)用戶的具體功能基本結(jié)構(gòu)(續(xù))基本結(jié)構(gòu)(續(xù))MATLAB在定義輸入輸出參數(shù)時不需要指出變量的類型,而是將參數(shù)默認為雙精度型MATLAB在定義參數(shù)時,沒有確定輸入?yún)?shù)的維數(shù)或者尺寸M語言的函數(shù)文件不僅可以有一個輸入?yún)?shù)和一個返回值,還可以為M語言函數(shù)文件定義多個輸入?yún)?shù)和多個輸出參數(shù)4.4.2 4.4.2 輸入輸出參數(shù)輸入輸出參數(shù)例4-15 多個輸入輸出參數(shù)的M函數(shù)functionavg,stdev,r=ourstats(x,tol)%
22、OURSTATS多輸入輸出參數(shù)示例% 該函數(shù)計算處理矩陣,得到相應(yīng)的均值、標(biāo)準(zhǔn)差和矩陣的秩m,n=size(x);if m=1 m=n;end% Averageavg=sum(x)/m;% Sandad deviationstdev=sqrt(sum(x.2)/m-avg.2);% Ranks=svd(x);r=sum(stol);輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù))運行例4-15 A=1 2 3;4 5 6A = 1 2 3 4 5 6 a,s,r=ourstats(A,0.1)a = 2.5000 3.5000 4.5000s = 1.5000 1.5000 1.5000r = 2 a,s
23、=ourstats(A,0.1)a = 2.5000 3.5000 4.5000s = 1.5000 1.5000 1.5000輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù)) a=ourstats(A,0.1)a = 2.5000 3.5000 4.5000 調(diào)用該函數(shù)時,將輸出參數(shù)依次寫在一個向量中, 若輸出參數(shù)的個數(shù)與函數(shù)定義的輸出參數(shù)個數(shù)不一致時,將計算得到的前幾個輸出參數(shù)作為返回值, 若輸出參數(shù)的個數(shù)等于指定的輸出參數(shù)個數(shù)時,計算結(jié)果依次賦值給不同的變量。例4-16 nargout和nargin示例function c=testarg(a,b)% TESTARG檢測輸入輸出參數(shù)個數(shù)% 該函數(shù)根據(jù)
24、不同的輸入輸出參數(shù)個數(shù)進行相應(yīng)的操作if (nargout=1) disp(使用該函數(shù)必須指定一個輸出參數(shù)!); returnendswitch nargin case 0 disp(使用該函數(shù)必須指定一個輸入?yún)?shù)!); c=; return case 1 c=a.2; case 2 c=a+b;end輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù))函數(shù)nargin用來獲取函數(shù)的輸入?yún)?shù)個數(shù)函數(shù)nargout用來獲取輸出函數(shù)個數(shù)運行例4-16 A=1 2 3;B=2 3 5; testarg(A,B)使用該函數(shù)必須指定一個輸出參數(shù)! C=testarg使用該函數(shù)必須指定一個輸入?yún)?shù)!C = C=testa
25、rg(A)C = 1 4 9 D=testarg(A,B)D = 3 5 8 E=testarg(A,B,C)? Error using = testargToo many input arguments.輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù))MATLAB的M函數(shù)文件還可以具有個數(shù)不確定的輸入、輸出參數(shù)在定義M函數(shù)文件時,不指明輸入、輸出參數(shù)的個數(shù),而是在程序中通過編寫程序完成具體參數(shù)的確定完成該功能主要依靠varargin和varargout函數(shù)當(dāng)函數(shù)的定義具有以下形式時 function y=function_name(varargin) 函數(shù)function_name可以接受任意個數(shù)的輸入
26、參數(shù) 使用varargin函數(shù)接受M函數(shù)參數(shù)時,將用戶輸入的所有參數(shù)構(gòu)建成為一個元胞數(shù)組,該元胞數(shù)組中的元素為用戶輸入的參數(shù)當(dāng)函數(shù)的定義具有以下形式時 function varargout=function_name(n) 函數(shù)function_name可以輸出任意個數(shù)的輸出參數(shù) 使用varargout函數(shù)輸出M函數(shù)參數(shù)時,需要將所有必要的輸出參數(shù)傳遞給元胞數(shù)組,在傳遞參數(shù)時,還需要注意參數(shù)的順序輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù))例4-17 不確定的輸入?yún)?shù)個數(shù)function y=varargin_example(varargin)% VARARGIN_EXAMPLE不確定輸入?yún)?shù)例子st
27、r=sprintf(輸入?yún)?shù)的個數(shù):=%d,length(varargin);disp(str);y=0;% varargin的類型class(varargin)for i=1:length(varargin) %varargin為元胞數(shù)組 if(isnumeric(varargini) % 將每個為數(shù)值數(shù)組的輸入?yún)?shù)的第一個元素累加求和 y=y+varargini(1); endend輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù))運行例4-17 不確定的輸入?yún)?shù)個數(shù) varargin_example輸入?yún)?shù)的個數(shù):=0ans =cellans = 0 varargin_example(a,1 2 3,
28、3,rand(2,5)輸入?yún)?shù)的個數(shù):=4ans =cellans = 4.6154輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù))class(varargin)class(varargin)例4-18 不確定的輸出參數(shù)個數(shù)function varargout=varargout_example(varargin)% VARARGOUT_EXAMPLE不確定個數(shù)的輸出參數(shù)% 判斷輸出參數(shù)的個數(shù)% 下面注釋行中的代碼執(zhí)行有錯誤% str=sprintf(輸出參數(shù)的個數(shù):=%d,length(varargout);% 必須使用nargoutstr=sprintf(輸出參數(shù)的個數(shù):=%d,nargout);di
29、sp(str);if(nargout a b=varargout_example(1,2,3,4)輸出參數(shù)的個數(shù):=2a = 4b = 3輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù))if(nargout a b=varargout_example(3,4,5,9)輸出參數(shù)的個數(shù):=2a = 9b = 5輸入輸出參數(shù)(續(xù))輸入輸出參數(shù)(續(xù))if(nargout x=1:11; mean,mid=newstats(x)mean = 6mid = 6 x=1:10; a,b=newstats(x)a = 5.5000b = 5.5000子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))私有函數(shù)私有函數(shù)被放置在名稱
30、為private的子目錄中,僅能被那些位于private子目錄的上一層目錄中的函數(shù)調(diào)用假設(shè)MATLAB的搜索路徑中包含路徑ProjectA,那么所有位于ProjectAprivate路徑下的函數(shù),只能被在其上一層路徑ProjectA中的函數(shù)文件調(diào)用不同父路徑下的私有函數(shù)可以使用相同的函數(shù)名MATLAB搜索函數(shù)時優(yōu)先搜索私有函數(shù)如果同時存在私有函數(shù)名func1.m和非私有函數(shù)名func1.m,則私有函數(shù)func1.m被優(yōu)先執(zhí)行創(chuàng)建私有函數(shù)的方法將需要設(shè)置為私有的函數(shù)拷貝到一個private子目錄中子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))例4-21 私有函數(shù)示例function x=pmean
31、(v,n)% MEAN私有函數(shù)例子% 將該函數(shù)文件保存在private子目錄中,則該函數(shù)僅能被在上層目錄中的函數(shù)文件調(diào)用disp(私有函數(shù) pmean);x=sum(v)/n;子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))例4-21 調(diào)用私有函數(shù)的函數(shù)文件(newstats.m)functionavg,med=newstats(u) % 主函數(shù)% NEWSTATS計算均值和中間值n=length(u);avg=mean(u,n); % 調(diào)用子函數(shù)avg1=pmean(u,n); % 調(diào)用私有函數(shù)med=med
32、ian(u,n); % 調(diào)用子函數(shù)function a=mean(v,n) % 子函數(shù)% 計算平均值disp(子函數(shù) mean);a=sum(v)/n;function m=median(v,n) % 子函數(shù)% 計算中間值w=sort(v);if rem(n,2)=1 m=w(n+1)/2);else m=(w(n/2)+w(n/2+1)/2;end子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))運行例4-21 調(diào)用私有函數(shù)的函數(shù)文件(newstats.m) x=1:10; a b=newstats(x)子函數(shù) mean私有函數(shù) pmeana = 5.5000b = 5.5000子函數(shù)和私有函數(shù)(
33、續(xù))子函數(shù)和私有函數(shù)(續(xù))私有函數(shù)和子函數(shù)比較子函數(shù)和私有函數(shù)(續(xù))子函數(shù)和私有函數(shù)(續(xù))函數(shù)類型子函數(shù)私有函數(shù)作用范圍 同一個M函數(shù)文件在上層路徑中的函數(shù)文件內(nèi)結(jié)構(gòu)保存在同一個M語言函數(shù)文件中,在M語言文件可以不包含任何子函數(shù)保存在子目錄private下局部變量:在M函數(shù)內(nèi)部聲明并使用的變量只在本函數(shù)范圍內(nèi)有效僅能在函數(shù)調(diào)用執(zhí)行期間被使用,一旦函數(shù)結(jié)束運行,則變量占用的內(nèi)存空間自動釋放,變量的數(shù)值也不存在了例4-22 局部變量的例子function local% LOCAL察看局部變量的例子x=rand(2,2);y=zeros(2,2);z=函數(shù)中的變量;u=x,y,z;disp(z)wh
34、os4.4.4 4.4.4 局部變量和全局變量局部變量和全局變量運行例4-22 局部變量的例子 local函數(shù)中的變量Name Size Bytes Class u 1x3 256 cell array x 2x2 32 double array y 2x2 32 double array z 1x6 12 char arrayGrand total is 31 elements using 332 bytes whos全局變量:在函數(shù)之外定義的變量可以為本文件中其他函數(shù)所共用MATLAB將全局變量保存在特殊的工作空間進行統(tǒng)一維護、管理將變量聲明為全局變量的方法在使用變量前,用關(guān)鍵字globa
35、l聲明例:聲明全局變量XY global XY whos Name Size Bytes Class XY 0 x0 0 double array (global)Grand total is 0 elements using 0 bytes局部變量和全局變量(續(xù))局部變量和全局變量(續(xù))使用global關(guān)鍵字創(chuàng)建全局變量時有三種情況若聲明為全局的變量在當(dāng)前空間和全局空間都不存在,則創(chuàng)建一個新的變量,然后為這個變量賦值為空數(shù)組,該變量同時存在于局部工作空間和全局工作空間若聲明為全局的變量已經(jīng)存在與全局空間中,則不會在全局工作空間創(chuàng)建新的變量,其數(shù)值同時賦值給局部工作空間中的變量若聲明為全局的變
36、量存在于局部工作空間中,而全局工作空間不存在,則系統(tǒng)會提示一個警告信息,同時將局部的變量“挪”到全局工作空間中局部變量和全局變量(續(xù))局部變量和全局變量(續(xù))例4-23 全局變量的例子 % 創(chuàng)建全局變量 global myx % 察看全局變量的信息 whos Name Size Bytes Class myx 0 x0 0 double array (global)Grand total is 0 elements using 0 bytes % 給全局變量賦值 myx=10myx = 10 % 察看全局變量的信息 whos Name Size Bytes Class myx 1x1 8 do
37、uble array (global)Grand total is 1 element using 8 bytes局部變量和全局變量(續(xù))局部變量和全局變量(續(xù)) % 清除變量 clear myx myx? Undefined function or variable myx. % 察看信息 whos whos global Name Size Bytes Class myx 1x1 8 double array (global)Grand total is 1 element using 8 bytes局部變量和全局變量(續(xù))局部變量和全局變量(續(xù)) % 在局部工作空間再次創(chuàng)建變量 myx=
38、23myx = 23 % 察看變量的信息 whosName Size Bytes Classmyx 1x1 8 double arrayGrand total is 1 element using 8 bytes whos globalName Size Bytes Classmyx 1x1 8 double array (global)Grand total is 1 element using 8 bytes局部變量和全局變量(續(xù))局部變量和全局變量(續(xù)) % 將其修改為全局變量 global myxWarning: The value of local variables may hav
39、e been changed to match the globals. Future versions of MATLAB will require that you declare a variable to be global before you use that variable. % 察看變量的數(shù)值 myxmyx = 10局部變量和全局變量(續(xù))局部變量和全局變量(續(xù))將局部變量轉(zhuǎn)變?yōu)槿肿兞康倪^程中原來的局部變量的數(shù)值丟失了 % 清除當(dāng)前的工作空間 clear whos whos globalName Size Bytes Classmyx 1x1 8 double array
40、(global)Grand total is 1 element using 8 bytes % 清除所有的工作空間 clear all whos whos global 局部變量和全局變量(續(xù))局部變量和全局變量(續(xù))保留變量這類變量在MATLAB中被聲明為persistent這類變量在函數(shù)退出時不被釋放,當(dāng)函數(shù)再一次被調(diào)用時,變量保留上次退出時的值保留變量的特征變量僅能在聲明變量的函數(shù)內(nèi)使用,其他函數(shù)不能直接使用保留變量函數(shù)執(zhí)行退出后,MATLAB不清除保留變量占用的內(nèi)存當(dāng)函數(shù)被清除或者重新編輯后,保留的變量被清除局部變量和全局變量(續(xù))局部變量和全局變量(續(xù))例4-24:function
41、 y=persistent_example(x) % PERSISTENT_EXAMPLE 保留變量使用示例 for i=1:x y=myfun; end function y=myfun % 子函數(shù) % persistent關(guān)鍵字的使用 persistent count; % count記錄函數(shù)調(diào)用的次數(shù) if (isempty(count) count=1; else count=count+1; end str=sprintf(第%d次調(diào)用該函數(shù),count); disp(str); y=count;局部變量和全局變量(續(xù))局部變量和全局變量(續(xù))運行例4-24: persistent_
42、example(1)第1次調(diào)用該函數(shù)ans = 1 persistent_example(3)第2次調(diào)用該函數(shù)第3次調(diào)用該函數(shù)第4次調(diào)用該函數(shù)ans = 4局部變量和全局變量(續(xù))局部變量和全局變量(續(xù))在MATLAB命令行中鍵入指令: clear all則所有的變量都會被清除 persistent_example(3)第1次調(diào)用該函數(shù)第2次調(diào)用該函數(shù)第3次調(diào)用該函數(shù)ans = 3當(dāng)用戶在MATLAB命令行窗口鍵入一條命令或者執(zhí)行M語言文件中包含的一條語句或者指令時,MATLAB解釋器就負責(zé)解析用戶的輸入,并且給出相應(yīng)的答案MATLAB解釋器解析命令按照一定的優(yōu)先級進行首先判斷輸入的命令是否為
43、變量若不是內(nèi)存中的變量,判斷輸入的命令是否為MATLAB的內(nèi)建函數(shù)若不是內(nèi)建函數(shù),則判斷輸入的命令是否為子函數(shù)若不是子函數(shù),則判斷輸入的命令是否為私有函數(shù)若不是私有函數(shù),則判斷輸入的命令是否為MATLAB搜索路徑中所包含的某個文件或函數(shù)若在同一個路徑下發(fā)現(xiàn)同名的三種類型的文件MEX文件、P代碼文件和M代碼文件,則優(yōu)先執(zhí)行MEX文件,其次是P代碼文件,最后執(zhí)行的是M語言文件4.4.5 4.4.5 函數(shù)執(zhí)行規(guī)則函數(shù)執(zhí)行規(guī)則例4-25 MATLAB命令解析的優(yōu)先級 sin=This is a string!sin =This is a string! sin(3)ans =i which sinsi
44、n is a variable. clear all sin(3)ans = 0.1411 which sinsin is a built-in function.函數(shù)執(zhí)行規(guī)則(續(xù))函數(shù)執(zhí)行規(guī)則(續(xù))若需要了解具體調(diào)用的是哪一個對象,則可以使用which命令獲取相應(yīng)的信息MATLABMATLAB編程基礎(chǔ)(續(xù))編程基礎(chǔ)(續(xù))4.1 概述4.2 流程控制4.3 腳本文件4.4 函數(shù)文件4.5 M文件調(diào)試4.6 M文件性能分析4.7 小結(jié)4.5 M4.5 M文件調(diào)試文件調(diào)試M文件的調(diào)試可以在文件編輯器中進行M語言的文件編輯器不僅僅是一個文件編輯器,還是一個可視化的調(diào)試開發(fā)環(huán)境可以在命令行中結(jié)合具體的
45、命令進行M M文件調(diào)試(續(xù))文件調(diào)試(續(xù))應(yīng)用程序的錯誤語法錯誤包括詞法或者文法的錯誤運行時的錯誤指程序運行過程中得到的結(jié)果不是用戶需要的結(jié)果程序的調(diào)試是在程序無法得到正確結(jié)果時進行程序修正的唯一手段M文件是一種解釋型語言,只有在運行過程中才能發(fā)現(xiàn)應(yīng)用程序的錯誤M M文件調(diào)試(續(xù))文件調(diào)試(續(xù))M語言文件編輯器提供Breakpoints菜單進行程序調(diào)試M M文件調(diào)試(續(xù))文件調(diào)試(續(xù))Breakpoints菜單中的命令用來設(shè)置各種斷點,只有設(shè)置了斷點的應(yīng)用程序才能進行調(diào)試提供的自動斷點Stop if ErrorStop if WarningStop if NaN or InfStop if A
46、ll Errors自動斷點可以在程序中設(shè)置,當(dāng)程序運行過程中發(fā)生了錯誤或警告,則程序運行中斷,進如調(diào)試狀態(tài)M M文件調(diào)試(續(xù))文件調(diào)試(續(xù))例4-26 M文件調(diào)試代碼stats_error.m001 function totalsum,average=stats_error(input_vector)002 % STATS_ERROR-Calculates cumulative total &average003 totalsum=sum(input_vector);004 average=ourmean(input_vector);005006 function y=ourmean(x)00
47、7 % OUTMEAN-Calculates average008 m,n=size(x);009 if m=1010 m=n;011 end012 y=sum(input_vector)/m;M M文件調(diào)試(續(xù))文件調(diào)試(續(xù))進行調(diào)試在MATLAB環(huán)境中啟動M文件編輯器,然后選擇M文件編輯器中“Breakpoints”菜單下的“Stop if Error”命令注意:此時不一定要將stats_error.m文件打開M M文件調(diào)試(續(xù))文件調(diào)試(續(xù))在MATLAB命令行窗口中鍵入指令 sum avg=stats_error(rand(1,50)? Undefined function or variable input_vector.Error in = D:MATLAB講義stats_error.m (ourmean)On line 12 = y=sum(input_vector)/m;K MATLAB命令行窗口處于調(diào)試狀態(tài),其命令行提示符為“K”,在該命令行提示符中可以鍵入MATLAB指令進行運算和處理。M M文件調(diào)試(續(xù))文件調(diào)試(續(xù))K whosName Size Bytes Class m 1x1
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 游戲經(jīng)銷商協(xié)議
- 建筑綠化凈化施工合同
- 橋梁照明系統(tǒng)安裝合同
- 預(yù)付款合同管理要點
- 建筑工程技術(shù)建造師聘用合同
- 云計算行業(yè)試用期合同簽訂策略
- 生物醫(yī)藥工廠勞動合同模板
- 兒童醫(yī)院護士錄用合同模板
- 電子產(chǎn)品租賃合同協(xié)議書
- 兒童科學(xué)館裝修協(xié)議
- 蘇科版初中初一數(shù)學(xué)下冊《冪的運算》說課稿
- 報價單報價單
- 面試評估表及評分標(biāo)準(zhǔn)及面試評估表及評估標(biāo)準(zhǔn)
- 消防安全重點單位規(guī)范化管理手冊
- 【拓展閱讀】類文閱讀《王羲之吃墨》
- 熱電廠機組A級檢修策劃書
- 浙教版數(shù)學(xué)八年級下冊全冊優(yōu)質(zhì)課件
- 第三講:蘇聯(lián)模式興衰
- GB/T 5623-2008產(chǎn)品電耗定額制定和管理導(dǎo)則
- GB/T 41002-2022兒童箱包通用技術(shù)規(guī)范
- 光學(xué)5(光的偏振)
評論
0/150
提交評論