函數(shù)是一起執(zhí)行任務(wù)的一組語句。在MATLAB中,函數(shù)是在單獨的文件中定義的。文件名和函數(shù)名應(yīng)該相同。
函數(shù)在其自己的工作空間(也稱為本地工作空間)中對變量進行操作,與在MATLAB命令提示符下訪問的工作空間(稱為基本工作空間)不同。
函數(shù)可以接受多個輸入?yún)?shù),并且可以返回多個輸出參數(shù)。
函數(shù)語句的語法是-
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
以下名為mymax的函數(shù)應(yīng)寫入名為mymax.m的文件中。它以五個數(shù)字作為參數(shù),并返回最大的數(shù)字。
創(chuàng)建一個函數(shù)文件,命名mymax.m并在其中輸入以下代碼-
function max = mymax(n1, n2, n3, n4, n5) %此函數(shù)用于計算 %輸入五個數(shù)字 max = n1; if(n2 > max) max = n2; end if(n3 > max) max = n3; end if(n4 > max) max = n4; end if(n5 > max) max = n5; end
函數(shù)的第一行以關(guān)鍵字 function開頭 。它給出了函數(shù)的名稱和參數(shù)的順序。在我們的示例中,mymax函數(shù)具有五個輸入?yún)?shù)和一個輸出參數(shù)。
函數(shù)語句后的注釋行提供幫助文本。當您鍵入以下內(nèi)容時,將打印這些行:
help mymax
MATLAB將執(zhí)行上述語句并返回以下結(jié)果-
This function calculates the maximum of the five numbers given as input
您可以將函數(shù)稱為-
mymax(34, 78, 89, 23, 11)
MATLAB將執(zhí)行上述語句并返回以下結(jié)果-
ans = 89
匿名函數(shù)就像傳統(tǒng)編程語言中的內(nèi)聯(lián)函數(shù)一樣,是在單個MATLAB語句中定義的。它由一個MATLAB表達式以及任意數(shù)量的輸入和輸出參數(shù)組成。
您可以直接在MATLAB命令行或在函數(shù)或腳本中定義匿名函數(shù)。
這樣,您可以創(chuàng)建簡單的功能,而不必為其創(chuàng)建文件。
從表達式創(chuàng)建匿名函數(shù)的語法是
f = @(arglist)expression
在此示例中,我們將編寫一個名為power的匿名函數(shù),該函數(shù)將兩個數(shù)字作為輸入,并將第一個數(shù)字提高為第二個數(shù)字的冪。
創(chuàng)建一個腳本文件并在其中鍵入以下代碼-
power = @(x, n) x.^n; result1 = power(7, 3) result2 = power(49, 0.5) result3 = power(10, -10) result4 = power (4.5, 1.5)
運行文件時,它顯示-
result1 = 343 result2 = 7 result3 = 1.0000e-10 result4 = 9.5459
必須在文件中定義除匿名函數(shù)以外的任何函數(shù)。每個函數(shù)文件都包含一個首先出現(xiàn)的必需主函數(shù),以及在主函數(shù)之后并由其使用的任意數(shù)量的可選子函數(shù)。
可以從定義主文件的文件外部(從命令行或其他函數(shù))調(diào)用主函數(shù),但是不能從命令行或其他函數(shù)在功能文件外部調(diào)用子函數(shù)。
子函數(shù)僅對主函數(shù)和定義它們的函數(shù)文件中的其他子函數(shù)可見。
讓我們寫一個名為quadratic的函數(shù)來計算一個二次方程的根。該函數(shù)包含三個輸入:二次系數(shù)、線性系數(shù)和常數(shù)項。它將回歸根。
函數(shù)文件quadratic.m將包含主函數(shù)quadratic和子函數(shù)disc,后者計算判別式。
創(chuàng)建一個函數(shù)文件 quadratic.m 并在其中輸入以下代碼
function [x1,x2] = quadratic(a,b,c) %此函數(shù)返回 %二次方程。 %它需要3個輸入?yún)?shù) %x2,x和 %常數(shù)項 %它返回根 d = disc(a,b,c); x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end % end of quadratic function dis = disc(a,b,c) %函數(shù)計算判別式 dis = sqrt(b^2 - 4*a*c); end % end of sub-function
您可以從命令提示符處調(diào)用上述功能,如下所示:
quadratic(2,4,-4)
MATLAB將執(zhí)行上述語句并返回以下結(jié)果-
ans = 0.7321
您可以在另一個函數(shù)的主體內(nèi)定義函數(shù)。這些稱為嵌套函數(shù)。嵌套函數(shù)包含任何其他函數(shù)的任何或所有組件。
嵌套函數(shù)在另一個函數(shù)的范圍內(nèi)定義,它們共享對包含函數(shù)的工作區(qū)的訪問。
嵌套函數(shù)遵循以下語法-
function x = A(p1, p2) ... B(p2) function y = B(p3) ... end ... end
讓我們重寫前面實例中的quadratic函數(shù),不過,這次disc函數(shù)將是一個嵌套函數(shù)。
創(chuàng)建一個函數(shù)文件quadratic2.m,并在其中輸入以下代碼-
function [x1,x2] = quadratic2(a,b,c) function disc %嵌套函數(shù) d = sqrt(b^2 - 4*a*c); end % 結(jié)束函數(shù)disc disc; x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end %結(jié)束函數(shù) quadratic2
您可以從命令提示符處調(diào)用上述函數(shù),如下所示:
quadratic2(2,4,-4)
MATLAB將執(zhí)行上述語句并返回以下結(jié)果-
ans = 0.73205
私有函數(shù)是僅對有限的一組其他函數(shù)可見的主函數(shù)。如果不想公開函數(shù)function(s)的實現(xiàn),可以將它們創(chuàng)建為私有函數(shù)。
私有函數(shù)位于具有特殊名稱 Private 的子文件夾中。
它們僅對父文件夾中的函數(shù)可見。
讓我們重寫quadratic函數(shù)。不過,這一次,disc函數(shù)計算判別式,將是一個私有函數(shù)。
在工作目錄文件夾中創(chuàng)建一個名為 private 的子文件夾,在其中存儲以下函數(shù)文件 disc.m
function dis = disc(a,b,c) %函數(shù)計算判別式 dis = sqrt(b^2 - 4*a*c); end %子函數(shù)結(jié)束
在您的工作目錄中創(chuàng)建一個函數(shù) quadratic3.m ,并在其中輸入以下代碼-
function [x1,x2] = quadratic3(a,b,c) % 這個函數(shù)返回 % 一元二次方程。 它需要3個輸入?yún)?shù) % 它們是 x2,x 和 % 常數(shù)項 % 它返回根 d = disc(a,b,c); x1 = (-b + d) / (2*a); x2 = (-b - d) / (2*a); end %結(jié)束 quadratic3
您可以從命令提示符處調(diào)用上述函數(shù),如下所示:
quadratic3(2,4,-4)
MATLAB將執(zhí)行上述語句并返回以下結(jié)果-
ans = 0.73205
全局變量可以由多個函數(shù)共享。為此,您需要在所有函數(shù)中將變量聲明為全局變量。
如果要從基本工作空間訪問該變量,請在命令行中聲明該變量。
全局聲明必須在變量實際在函數(shù)中使用之前發(fā)生。最好將大寫字母用作全局變量的名稱,以將其與其他變量區(qū)分開。
讓我們創(chuàng)建一個名為average.m的函數(shù)文件,并在其中輸入以下代碼-
function avg = average(nums) global TOTAL avg = sum(nums)/TOTAL; end
創(chuàng)建一個腳本文件并在其中鍵入以下代碼-
global TOTAL; TOTAL = 10; n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42]; av = average(n)
運行文件時,它將顯示以下結(jié)果-
av = 35.500