10/25/2006

6.9函數為輸入參數之呼叫法

有些函數之輸入參數必須呼叫其他函數名稱,以該函數進行運算。例如fzero、fminsearch、 fminbnd等等,其中均需輸入或呼叫適當函數名稱,使運算正常進行。大體上傳輸函數之方法有四:

一、 以字串之型式對照M函數檔之名稱。例如:


function y = freebody(time)
% calculation of height with respect to time
y =1/2*980*time.*time;

>>[x,f]=fzero('freebody',[0 1])
x = 0
f = 0


二、 以現存函數名稱之握把呼叫,例如:


>>[x,f]=fzero(@freebody,[0 1])
x = 0
f = 0

>>f1=@freebody;[x,f]=fzero(f1,[0 1])
x = 0
f = 0


三、 利用inline指令轉換,例如:


  >> g=inline('freebody(time)')
g = Inline function:
g(time) = freebody(time)

>> [x, value]=fzero(g,[0 1])
x = 0
value = 0


四、 直接使用運算式,例如:

>>f1='x.^2-5';[x, value]=fzero(f1,[0 5])

x = 2.2361
value = 8.8818e-016

或,

>>[x, value]=fzero('x.^2-5',[0 5])
x = 2.2361
value = 8.8818e-016


上述四種呼叫方式原則上均可適用。但在MATLAB之應用上,仍以握把呼叫較有效率,其執行速度也較快。雖然如此,由於撰寫程式本乎於習慣,故何者為佳,端視當時情況而定。一般之匿函數屬於握把呼叫型,可以使用在任何主函數內的位置。但這種函數以簡短為主,無法應用在大程式上。以下面之三個匿名函數為例,f1、f2各自定義內容,而g則由f2配合f1,輾轉以x為自變數,則不必利用傳統的函數型式,可以輕易加以串聯,並得到g([1 2 3])之結果:


>>f1=@(x) sqrt(x);
>>f2=@(x) 5*exp(-x);
>>g=@(x) f2(f1(x));
>>g([1:3])

ans =
1.8394 1.2156 0.8846