10/25/2006

6.7函數輸出入參數

在函數應用中,變數之轉換至為重要。一般函數內定義之變數均屬區域性變數(Local variables),只能提供該函數內部使用,當函數執行完畢後,即被清除。為維持參數之一貫性,當呼叫某函數,也必須同時傳遞重要之變數作為該函數之輸入值,以為繼續計算之根據。執行函數完畢時,有些結果仍寄望能傳回呼叫主程式,此時必須有輸出參數。

6.7.1全域性變數


有些變數對許多函數而言有時同等重要,此時就可宣告為全域性變數(Global variables),並在需要此變數的函數中同時宣告。此變數即可共同使用,不會因函數之轉換而遭到清除。在前面所討論的敘述檔中,實際上其所使用的變數均為全域性的變數。因此每次執行後,其相關之變數均有可能被更改。

全域性變數之宣告如下例:

global GRAVITY X Y Z


上式即宣告GRAVITY、X 、Y、Z等四個變數為全域性,習慣上均用大寫,以與其他區域型變數區別。不過,這並不是必然的作法,小寫也一樣可用。

6.7.2 eval函數


一般下指令時,通常以其指令名稱及需要之參數在指令窗下或在檔案中直接下,但有些時候我們希望指令也是一種變數的型式,使指令內容也能依檔案之內容而變化。換言之,先將指令化為文字串,但然依文字串之內容轉為指令去執行。MATLAB提供一個eval函數具有轉換的功能,其格式如下:

eval(指令相關敘述)

例如:以下面程式求某一連續正整數累進之總和


% evalsum.m for demonstration
% Find the sum of cumulative sum(1:n)
tsum=zeros(1,10);xsum=0;
for i=1:10,
xsum=xsum+eval(['sum(1:',int2str(i),')']);
tsum(i)=xsum;
end
1:10
tsum


執行後:


>> evalsum
ans = 1 2 3 4 5 6 7 8 9 10
tsum = 1 4 10 20 35 56 84 120 165 220


式中之eval函數是將sum(1:1)、sum(1:2),…sum(1:10)逐一計算後累加。由於其中sum之參數逐一變化,故必須用數值改變為字串後(int2str),再用eval函數轉為指令執行之。

6.7.3 輸出入參數個數nargin與nargout


呼叫函數時,大部份需要輸入參數,經過處理過後,也需要輸出參數以獲得希望的結果。為使程式能掌握呼叫的參數,通常程式中有設定輸入與輸出參數之個數。其變數分別為nargin與narout,使程序進行前能依實際需要,決定所要進行的步驟。所以上述兩參數名稱已為程式內部參數,程式中可依需要使用,但在設定變數時,需不得重覆。

下面的例子為計算空心圓柱體體積之程式,主要針對輸入項少於原設值時,採用預設值的方式。


function [volume]=pillar(Do,Di,height)
% Find the volume of a hollow pillar
% ro,ri:outside & inside diameters
if nargin<1,
height=1;
di=0;
do=1;
end
volume=abs(Do.^2-Di.^2).*height*pi/4;


此程式利用nargin變數,確定所缺少的輸入項並補上預設值。所以即使不使用輸入參數,其結果將以直徑及高度均為一單位之圓柱體計算其體積。如:


>>pillar
ans =
0.7854
>>pillar(5,2,[1:5])
ans =
16.4934 32.9867 49.4801 65.9734 82.4668


即使利用pillar函數,亦可計算陣列輸入時之對應體積。可以增加程式之使用彈性。對於nargout參數之應用亦與nargin相同,當下指令時,有時未提出輸出的項目,此時其nargout=0。此時亦可利用這種情況決定是否進行繪圖或作其他動作。