10/25/2006

第六章 自訂函數

6.1敘述檔與函數檔


MATLAB依執行時之實質型式分為兩種,其一為前面所述之敘述檔( script files),另一為函數檔(function files);兩者均可在指令窗中呼叫。但敘述檔中,使用者可將檔案內所含的指令一一地在指令窗下執行,其執行過程中,所發生的變數均為整體性變數。因此執行敘述檔時,只能呼叫其檔案名稱,不能在名稱後面加上任何輸入參數。若要事先設定一些參數初值,辦法之一是執行之初立即設定,例如在工作空間內更動其中之變數值,然後再執行該指令。其二是在檔案中利用指令讀取特定檔案之資料或由鍵盤輸入資料。由鍵盤輸入指令可以累積成為指令之組合,並給予指令群之名稱,此名稱因而亦可作為指令在指令窗中直接執行。例如,有一個敘述檔之名稱為 pick_a _number.m,則在 MATLAB 指令窗中直接鍵入"pick_a _number"即可執行該檔案之內容。


% pick_a_number.m, a script file for demonstration.
% Pick up a number that equals to the randomly generated one
%
message='Please pick a number from 0-9 ==> ';
n=1;
while 1
A=input(message);
if isempty(A), A=0; end;
pick=fix(rand*10);
if A==pick,
disp('Congradulations, it''s done!')
break
else
disp(['The random number is ', num2str(pick),...
'. You have failed ',num2str(n),' times!'])
n=n+1;
end
end


執行的結果如下:

>> pick_a_number
Please pick a number from 0-9 ==> 2
The random number is 6. You have failed 1 times!
Please pick a number from 0-9 ==> 3
The random number is 2. You have failed 2 times!
Please pick a number from 0-9 ==> 4
Congradulations, it's done!


上述的程式為一個敘述檔,其內容為讀者自訂一個數字,由程式隨機產生一個數字,直到兩個數字相同為止。此程式使用無窮迴圈while 1,…end,故除非答對,才利用break中斷跳出,否則會繼續進行。有關迴圈指令,將在另節詳加討論。

在敘述檔中之變數是整體性(global) 的,也是共用的 ,故任何先前定義的變數,均可為敘述檔執行時所用,或改變其內容,所以它不需考慮輸入及輸出之問題。敘述檔用於必須重覆多次使用一群指令時最為方便。

函數檔案的內容與敘述檔大略相同,但其檔案可以作為MATLAB語言之一部份,可有輸入及輸出,且其變數的空間是自主的,不與公共空間共用。在型式上函數檔案之開頭一行需有一個函數名稱之宣告,然後用小括符包括其需要之輸入參數。函數名稱前可以有等號,在此等號之左方為其輸出之參數。等號之右方為函數名稱,其後有輸入參數。這些參數變數,無論是輸入或輸出,均可能代表一個數值或一個矩陣。在其他程式語言中,矩陣之變數均需經過宣告,在MATLAB的世界裡,可以省去此項運作,但若屬於大矩陣,事先安排矩陣空間,對提高運算效率有相當的助益。輸出入之參數中,均會預設為矩陣的型式。在函數檔案中,其所屬之變數均屬區域性的,除非特別另宣告為整體性參數。相關的函數特性等後段再作論述。

函數檔案之類型純為文字檔,故可在任何文書處理軟體中編輯或修改。不過,MATLAB也有一個程式編輯器,可以在此編輯器中偵錯(Debug)或編輯,這個編輯器比其他文書處理具有特殊的功能,新版中並有行號。若不使用編輯器,也可以在指令窗中亦直接打入type之指令,以觀察該檔案之內容。