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