MATLAB 函數嵌套
MATLAB中M文件有兩種類型,腳本M文件和函數M文件。腳本M文件是將可執行程序語句放入M文件中,就像在命令窗口那樣,按其語句順序及邏輯關系執行,可以理解為一般的順序執行程序語句。函數文件一般是聲明一個函數,方便以后操作中的調用。下面就函數文件中函數嵌套的使用做簡單分析。
對於函數文件,一個M文件只能定義一個總函數,即第一句function所定義的函數,而且整個M文件在外部使用時候表現出來的也只有這一個函數。如果需要多個函數嵌套,與其定義順序無關。下面結合一個簡單的例子來分析。
function y=average(x) %聲明一個函數,y=average(x),這個函數是取x的平均值,返回值是y y=mymean(x); %再次使用函數mymean,此處該函數並沒有定義算法,而是在后面對其進行描述 function a=mymean(v) %定義函數mymean,對於上級函數來說,此處為定義子函數,進行函數嵌套 %a=mean(v); %此處為了簡便,使用內部求均值函數mean,當然也可以自己寫,如下句。 a=sum(v)/length(v); %對v求和並除以總長度可得其平均
我們設一個向量z=[1,2,3,4,5,6,7],然后求其平均,在命令窗口輸入average(z)即可。相當於將z分別賦給x和v,由子函數得出返回值a,a和y是等價的,外層可輸出返回值。若去掉y=mymean(x)這句,則總函數外部無返回值輸出。
Matlab子函數
在matlab的函數定義中,如果函數如果函數較長或較多,往往可以將各函數分別寫在多個.m文件中,但有時函數可能很短,就幾行,可能希望將多個函數定義放在同一個.m文件中,這里就存在一個子函數的定義問題。
在matlab中一個.m文件中可以有多個的子函數,但僅能有一個主函數,並且M文件名必須和主函數相同[1]。(注:本人經自己試驗發現,自己使用的matlab7.5版本並不要求主函數名和.m文件名相同,但調用的時候使用的仍然必須是.m文件名,所以為了理解和記憶的方便,仍然建議M文件名和主函數名同名。)
其使用方法如下圖,圖1:
圖1
在這個.m文件中共有三個函數,其中subfunction是主函數,而add和subtract是兩個子函數,在函數調用是使用的是文件名subfunction_cxd(x,y),如[a,b]=subfuction_cxd(1,1),而如果僅是調用主函數的話,則會出現未定義的錯誤提示,如下圖,圖2:
圖2
我們甚至可以將函數的調用也寫到同一個.m文件中,如以下這個例子,見圖3:
圖3
這里我們定義了一個沒有輸入沒有輸出的函數該函數將作為主函數,而其他的函數均為子函數,由主函數調用子函數,而子函數間是可以互相調用,但不能調用主函數。這時的m文件不需要任何輸入,調用時可以直接點運行m文件的快捷鍵,或者在命令框中輸入m文件名然后回車運行,如上例輸入命令subfunction_cxd回車即可得到結果。
M文件中以下這種將函數的調用直接寫到m文件中的情況是不允許的,如圖4,出現錯誤提示如圖5,必須也把調用寫成函數的形式,或者將子函數都寫成單獨的m文件。
圖4
圖5
有時若有需要,子函數的定義甚至可以放在主函數中,即函數的嵌套,如圖6。這種嵌套函數是在函數第一次調用時就加以定義,一旦使用了嵌套函數,無論是嵌套函數還是主函數都必須以end作為函數的結束。當然子函數一旦定義將可在主函數中任意位置調用,如例子中求a時,定義了加法,但求c時仍然可以調用,無需再次定義。注:主函數結束時有一個end表示主函數結束切不可少。
圖6
編寫完函數后,如果有需要,可以吧自己所定義的函數成組的存儲在公共目錄下,即存在工具箱中,通過修改搜索路徑進行訪問,修改MATLAB的搜索路徑可以在主菜單File中的Set Path進行,也可以在命令框中輸入pathtool,獲取下圖路徑設置,見圖7。存儲后的函數在路徑下將可以直接調用。
圖7
matlab子函數私有函數
1.private與子函數:
子函數只能在主函數內容中調用,在函數外無法使用
function MainFunction %主函數內容 function SubFunction1 %子函數內容 end function SubFunction2 %子函數內容 end function SubFunction3 %子函數內容 end end
private函數是matlab軟件中廣泛使用的一種技術,其作用是限定某一些函數(private文件夾內)只能被令一些函數(private文件夾所在文件夾中的函數)使用,其他函數不能使用,這樣的話就可以避免一些無用(因為一般的matlab函數是全局可見的,而private函數只能被private文件夾所在文件夾中的函數調用。
2.ezplot和fplot
ezplot是easy plot的簡稱,意思就是簡化畫圖,只需給出函數體而無需變量范圍,例如想畫個圓,用ezplot就很方便:
syms x y ezplot('x^2+y^2=1',[-1.5 1.5],[-1 1])
fplot的意思是function plot,就是畫某一函數的曲線。顧名思義,若要畫一條函數的曲線,只要給出函數名和自變量范圍即可,例子如下:
fplot('sin',[-2 2])
matlab函數重載
C語言中可以通過參數的個數和數據類型來區分同名函數,實現函數的重載。
matlab的函數重載是通過檢查函數調用時輸入輸出的項數來實現。
nargin和nargout分別返回它所在函數當前被調用時實際輸入的項數
nargchk()檢查輸入的參數個數是否符合指定的范圍:
msgstr=nargchk(minargs,maxargs,numargs)
msgstr=nargchk(minargs,maxargs,numargs,'string')
其中,minargs和maxargs合法的最大值最小值,numargs為求得的輸入項的項數,可直接為函數nargin
如果輸入變量個數超出范圍,則返回錯誤信息;如果變量個數在范圍內則返回空矩陣。
例:實現兩個數相加或者三個數相乘
function B = addd(varargin) % varargin是matlab內部變量,cell型,依次存儲函數的所有輸入變量 % 如add(A1, A2, A3), 則 varargin{1} = A1, varargin{2} = A2, varargin{3} = A3 % nargin同樣也是matlab內部變量, 為函數輸入 變量的個數 %如果變量個數小於2大於3,則報錯 error(nargchk(2,3,nargin)); if nargin == 2 A1 = varargin{1}; A2 = varargin{2}; B=A1+A2; else A1 = varargin{1}; A2 = varargin{2}; A3 =varargin{3}; B=A1*A2*A3; end ; >> addd(1) Error using addd (line 2) Not enough input arguments. >> addd(1,2,3,4) Error using addd (line 2) Too many input arguments. >> addd(7,2,3) ans = 42
varargin變量用法靈活,如 function add(var1,var2,varargin)
此時varargin存儲的是var1和var2之后的變量