10/25/2006

6.2 自訂函數之型式

在MATLAB中,可以輕而易舉地定義自己需要之函數,這點大大增強MATLAB之應用能力。一個自定的函數為一個M-檔案,其儲存名稱須與函數名稱相同,格式如下:

function [輸出變數]=Name_of_function(輸入參數)

函數的名稱需以英文字母開頭,中間可為數字或底線,但其間不能有+,-,*,/等字眼。函數名稱長度依一般檔案名稱之規定,但最多僅認定63個字,不過長度如此長也不盡實際。且其名稱不要與現有MATLAB內定的相同,通常可用isvarname這個函數先檢查。輸出及輸入參數可為多個,亦可為矩陣,但輸入參數必須用一般括號括起來,而輸出參數若僅有一項輸出,則不必用任何括號,若有兩項以上,則需用中括號括起來。下面為一個簡單的例子:


function y = freebody(time)
% calculation of height with respect to time
% time: the elapsed time in seconds
% y:the depth of falling, cm
% Example: yy=freebody(1:20)
y =1/2*980*time.*time;%y=(1/2)gt^2




這是一個計算自由落體的例子。freebody為函數之名稱,time為其輸入變數,可為矩陣或向量。這個函數以time=[0:4:20],即time=[0 4 8 12 16 20]代入,執行如下:


>> yy=freebody(0:4:20)

yy =

0 7840 31360 70560 125440 196000



特別注意的是四秒時,自由落體將降至78.4m;若為4.5秒時,約達100m。911時紐約世貿大樓幾乎是以這個自由落體的速度塌下來,沒有任何阻檔,所以一直是個謎。在函數內容中,其說明行之前以%開頭,其後面的資料程式即認為是說明,不加執行。依照慣例,函數除第一行外,其最開始不包括空行的幾行為說明行,但每行前面需加%符號。這個說明行主要在敘述該函數之功能及使用方法。當你使用help freebody查詢這個自設的函數指令時,會出現在其說明之內容。例如:


>> help freebody
time: the elapsed time in seconds
y:the depth of falling, cm
Example: yy=freebody(1:20)




程式本體則包括其他函數呼叫、程式結構流程及交談式輸出入、計算、設定指令、註解及空行等。註解可佔全行,亦可在敘述指令之前後。但其前面均需加上%。MATLAB發現有%存在時,其後面之敘述均視為註解。若說明行不需佔有全行,則亦可在指令後加%後,隨時作進一步的說明,其情況如下:


   y =1/2*980*time.*time; %y=(1/2)gt^2



若有多行的註解行,但不想每行使用%為開頭時,可以在註解之前後行加上%{及%},這兩個符號必須單獨佔行。此外,MATLAB亦不處理空行,所以為使程式容易閱讀,可以加空行。但在程式開頭的第一次空行會中斷help指令所顯示的內容。

函數中所用之變數若不在函數之參數行列出,則應屬區域性變數。若要成為整體性變數則需要特別宣告(如global x y)。下面為兩連桿相接之位置的計算,在此自訂函數two_vectors中,其輸入項為r1,r212,輸出為結果點B之位置(x, y)。程式中,另有自創變數d2r, th1, th2等,這些均為區域性變數,故在運算結束跳離函數之後,這些變數將與函數外之參數無關。






function [x,y] = two_vectors(r1,r2,theta1,theta2)
% Find the resultant position of two vectors
% r1,r2: lengths of the two vectors, cm
% theta1, theat2: horizontal angles of r1 & r2, deg.
% x,y:coordinates of the tip position.cm
% Example: [xx,yy]=two_vectors(5,8,30,60)
d2r=pi/180;
th1=theta1*d2r;th2=theta2*d2r;
x =r1.*cos(th1)+r2.*cos(th2);
y =r1.*sin(th1)+r2.*sin(th2);



上項例子設兩桿之長度為5cm及8cm,對應水平角為20及50度,則經執行指令之結果如下:


>> [xx,yy]=two_vectors(5,8,20,50)
xx = 9.8408
yy = 7.8385


1 則留言:

Ching 吳子青 提到...

在M-fles裡面定義的function 在command windows裡面呼叫的時候,的確不會用到function裡面宣告的變數,注意到在workspace裡面不會出現.

如果想知道M-files裡面某變數的值,或想直接用在主程式裡,我用了global()指令
可是還是沒有出現,也呼叫不出來 ?

張貼留言