10/25/2006

6.4次函數

一個函數檔案可以包含一個以上的函數,這些多餘的函數又稱為次函數或副函數(Subfunction)。這些副函數僅能為主函數或其他同檔案之次函數相互呼叫。每個次函數均有其函數之定義行,而且一個接一個置於主函數後面,其順序不拘。下面為一個畫圓的例子,輸入圓的半徑,然後以亂數函數決定其圓心位置,再利用plot指令繪出圓。程式先從drawcircles(r)進入,在其for…end之迴圈中呼叫次函數circ(rr)決定圓心位置及計算圓的座標,而在其中又呼叫randxy之次函數,計算圓心位置,此時即為次函數呼叫次函數之例子。在主函數中利用plot指令則只要將對應之X、Y座標值輸入就可,其結果如圖。


function drawcircles(r) % 主函數
% Draw circles with radii of r.
global MAXR;
n=length(r);
MAXR=max(r);
hold on;
for i=1:n,
[X,Y]=circ(r(i));
plot(X,Y);
end
hold off;
axis equal;
end

function [x,y]=circ(rr)%次函數
% Calculate the points of a circle.
[xx,yy]=randxy;
theta=linspace(0,2*pi,60);
x=xx+rr*cos(theta);
y=yy+rr*sin(theta);
end

function [xx,yy]=randxy%次函數
global MAXR
% locate the position of the center.
xx=rand*MAXR;
yy=rand*MAXR;
end

執行此程式:

drawcircles(2:10)






















由於使用亂數決定各圓之圓心,故每次執行上項程式均會有不同的結果。只是其半徑均會一樣,本例之半徑為[4 3 1 5]。程式中,除兩個次函數circ 與randxy外,尚有呼叫max及length兩函數,這些都是MATLAB的內在函數。

次函數內之變數必須透過輸出入參數傳遞,否則僅能在自家之函數範圍內使用,包括主函數及其他次函數均無法讀取該次函數內之變數。除非將要共用之變數宣告為全域性(Global)。例如,函數中有用到全域變數MAXR,必須在使用到的函數(如randxy)中要宣告,才能共同使用。

呼叫次函數時,MATLAB首先檢查是否為次函數,然後檢查具有相同名稱之自有函數,最後才是內建函數。故若有相同函數名稱仍以次函數為優先。