10/25/2006

6.5匿名函數

匿名函數是一種不必具有函數檔的型式即可進行呼叫的函數。因此建立匿名函數可以在敘述檔或函數檔中加入,甚至在指令窗內加入即可。其基本型式如:

fhandle=@(arglist) expression

這個型式右邊以@開始,利用這個符號產生函數之握把(handle),以此作為呼叫此函數之起始,形成匿名函數之一部份。括號內之arglist為自變數名單,是由外進入函數之變數。而經空一格後之expression則為函數之主體。此匿名函數之握把可以設定給左邊之變數fhandle,利用此變數呼叫此匿名函數。下面為例子:


>>circ=@(r) r.*r*pi;
>>circ(2:2:10)
ans =
12.5664 50.2655 113.0973 201.0619 314.1593


這是一個計算圓面積的例子,只要輸入半徑,即可得到圓的面積。這時之自變數為r,而函數握把為circ,也是匿名函數之名稱。利用此握把,即可下指令執行該函數,因此直接將其作為函數之名稱餵入參數項即可執行。例如計算一個圓環所佔的面積,設內環半徑為2、外環為4,則以LoopArea可得:


>>LoopArea=circ(4)-circ(2)
>>LoopArea =
37.6991


若為兩個自變數,則其變數可以酌增,如:


>>Cllipse=@(x, y) 3*x.*x + 5*y.*y;
>>Cllipse([3 4 6],[5 7 8])
ans =
152 293 428


利用匿名函數,以小型函數為主,故使用上相當方便。這種函數亦可分組在細胞陣列之中,隨時呼叫所需進行之計算,例如:


>>Afun={@(x) x.*x, @(y) y.*y+100 , @(x,y) x.*x + y.*y + 100}
Afun =
Columns 1 through 2
[@(x) x.*x] [@(y) y.*y+100]
Column 3
[@(x,y) x.*x + y.*y + 100]
>>Afun{1}(5) + Afun{2}(10)
ans = 225

>>Afun{3}(5,10)
ans = 225


由於所設的匿名函數值第三項等於第一及第二項之和,故上述所求得之結果應會相同。

匿名函數定義時,其內也可以使用常數。但這些常數必須事先定義,才能完成匿名函數的型式。此匿名函數之常數將維持原先設定之值,不再改變。故若在運算過程中間即使更改該常數值,也不更動匿名函數之原常數值,除非重新定義該匿名函數。以下為例:


>>a=2;b=3; f=@(x) (a*x+b)
>>f = @(x) (a*x+b)
>>f(2)
ans = 7

>>a=5;b=8;f(2)
ans = 7

顯然這個匿名函數並未因常數a與b之改變而改變。必須必須在常數改變之後重新定義才能生效:

>>a=5;b=8; f=@(x) (a*x+b)
f = @(x) (a*x+b)

>>f(2)
ans = 18


在MATLAB有繪圖指令fplot可以繪製一般函數,其輸入只要函數及其前後之範圍:


>>a=3;b=4;g=@(x) (a*x.^2 +b*x)
g = @(x) (a*x.^2 +b*x)
>>fplot(g, [-10 10])





















也可以直接將匿名函數整個內容置入於其第一參數之中:

>>fplot(@(x) (a*x.^2 + b*x), [-20 20])