一個函式是一組在一起執行任務的語句。 在MATLAB中,函式在單獨的檔案中定義。檔案的名稱和函式的名稱應該是一樣的。
函式在自己的工作空間內的變數上執行,這個變數也稱為本地工作空間,與在MATLAB命令提示字元下存取的工作區(稱為基本工作區)不同。
函式可以接受多個輸入引數,並可能返回多個輸出引數。
函式語句的語法是 -
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
以下名稱為mymax
的函式應寫入名稱為mymax.m
的檔案中。它需要五個數位作為引數,並返回引數數位值的最大值。
建立名為mymax.m
的函式檔案,從左上角選單中點選新建->函式,並在其中鍵入以下程式碼 -
function max = mymax(n1, n2, n3, n4, n5)
% This function calculates the maximum of the
% five numbers given as input
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
上面範例程式碼中,函式的第一行以關鍵字function
開頭。它給出了函式的名稱和引數的順序。在這個例子中,mymax
函式有五個輸入引數和一個輸出引數。
函式語句之後的註釋行提供了幫助文字。當鍵入時,這些行被列印 -
Trial>> help mymax
This function calculates the maximum of the
five numbers given as input
現在,我們來呼叫這個函式 -
mymax(11,22,35,81,198)
執行上面程式碼,得到以下結果 -
Trial>> mymax(11,22,35,81,198)
ans =
198
匿名函式就像傳統程式設計語言中的行內函式,在單個MATLAB語句中定義。 它由單個MATLAB表示式和任意數量的輸入和輸出引數組成。
可以在MATLAB命令列或函式或指令碼中定義一個匿名函式。
這樣就可以建立簡單的函式,而無需為它們建立一個檔案。
從表示式建立匿名函式的語法是 -
f = @(arglist)expression
範例
在這個例子中,編寫一個名為power
的匿名函式,它將使用兩個數位作為輸入,並將第一個數位返回到第二個數位的冪值。
建立指令碼檔案並在其中鍵入以下程式碼 -
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
必須在檔案中定義除了匿名函式以外的其它任何函式。每個函式檔案包含主要出現的必需的主函式,以及主函式之後的任意數量的可選子函式。
可以從命令列或其他函式的檔案外部呼叫主函式,但不能從命令列或函式檔案外的其他函式呼叫子函式。
子函式僅對函式檔案中的主函式和其他子函式可見。
下面編寫一個名為quadratic
的函式來計算二次方程的根。該函式需要三個輸入引數:二次係數,線性系數和常數項。計算並會返回根。
函式檔案quadratic.m
將包含主函式quadratic
和次函式和子函式disc
,它計算判別式。
建立一個函式檔案quadratic.m
並在其中鍵入以下程式碼 -
function [x1,x2] = quadratic(a,b,c)
%this function returns the roots of
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficients of x2, x and the
%constant term
% It returns the roots
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)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
可以從命令提示字元呼叫上述函式 -
Trial>> quadratic(2,4,-4)
ans =
0.7321
可以在一個函式的主體內定義另一個函式。這樣的函式被稱為巢狀函式。巢狀函式包含任何其他函式的部分或全部元件。
巢狀函式在另一個函式的範圍內定義,並且它們共用對包含函式的工作空間的存取。
巢狀函式遵循以下語法 -
function x = A(p1, p2)
...
B(p2)
function y = B(p3)
...
end
...
end
範例
下面來重寫quadratic
函式,從上一個例子來看,然而這次disc
函式將是一個巢狀函式。
建立一個函式檔案quadratic2.m
並在其中鍵入以下程式碼 -
function [x1,x2] = quadratic2(a,b,c)
function disc % nested function
d = sqrt(b^2 - 4*a*c);
end % end of function disc
disc;
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of function quadratic2
在命令列視窗中呼叫quadratic2.m
函式,得到以下結果 -
Trial>> quadratic2(2,4,-4)
ans =
0.7321
私有函式是僅在有限的其他函式組中可見的主函式。如果不想公開函式的實現,則可以將其建立為私有函式。
私有函式處在在專用名稱為私有的子檔案夾中。
它們只對父檔案夾中的函式可見。
下面來重寫二次函式。這一次,計算判別式的disc
函式將是私有函式。
在工作目錄中建立一個名為private
的子檔案夾(F:\worksp\matlab\private)。儲存以下函式在檔案disc.m
中 -
function dis = disc(a,b,c)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
在工作目錄中建立一個函式quadratic3.m
(對應目錄為:F:\worksp\matlab),並在其中鍵入以下程式碼:
function [x1,x2] = quadratic3(a,b,c)
%this function returns the roots of
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficient of x2, x and the
%constant term
% It returns the roots
d = disc(a,b,c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of quadratic3
在Matlab命令列中,呼叫以上定義的函式 -
Trial>> quadratic3(2,4,-4)
ans =
0.7321
全域性變數可由多個函式共用。 為此,需要在所有函式中宣告變數為全域性變數。
如果要從基本工作區存取該變數,則在命令列中宣告該變數。
全域性宣告必須在函式實際使用變數之前進行。 將大寫字母用於全域性變數的名稱是一個很好的做法,以區別於其他變數。
範例
下面建立一個名為average.m
的函式檔案,並在其中鍵入以下程式碼 -
function avg = average(nums)
global TOTAL
avg = sum(nums)/TOTAL;
end
建立指令碼檔案並在其中鍵入以下程式碼 -
global TOTAL;
TOTAL = 10;
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
av = average(n)
執行上面範例程式碼,得到以下結果 -
Trial>> global TOTAL;
TOTAL = 10;
n = [36, 45, 35, 45, 33, 29, 50, 41, 58, 47];
av = average(n)
av =
41.9000