Matlab函式


一個函式是一組在一起執行任務的語句。 在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