Matlab 的「腳本」與「函式」有三點相同:
>> type trace看到 trace() 的原始碼: 其實,除掉線上說明和註解之外,這個函式只有一句話。 同理,
>> type collatz應該會看到 collatz() 的原始碼,包括其註解在內。 但是如果說
>> type sumMatlab 就很掃興地跟您說 sum() 是內建函式, 不讓您看原始碼 (其實內建函式的原始碼是用 C 語言寫的)。
「腳本」與「函式」的最大不同就在於變數的處理方式。 現在假設 [使用者自訂函式] 那一節寫的函式放在 collatz.m 裡面,而我們修改 [while 迴圈] 那一節寫的腳本程式,如下
放在 collaty.m 裡面。 而兩個檔案都在目前工作的檔案夾內。n=0; while (x>1) & (n<1000) n = n+1; if (rem(x,2)) x = 3*x+1; else x = x/2; end end
表面上的不同,是 collatz() 的參數 x 是從 Matlab 介面傳送過去的, 但是 collaty 的參數 x 沒有出現在 collaty.m 檔案裡面。
「腳本」有點像「巨集」,當您在 Matlab 介面中執行
>> collaty其實就好像您將 collaty.m 裡面的指令一句一句輸入給 Matlab 一樣:
當然如果是直接輸入在 Matlab 介面上,您也可以寫緊湊一點,像這樣:>> n=0; >> while (x>1) & (n<1000) >> n = n+1; >> if (rem(x,2)) >> x = 3*x+1; >> else >> x = x/2; >> end >> end
>> n=0;不論如何,您可以看到,即使 x 沒有寫在 collaty.m 裡面, 只要在執行 collaty 先執行 x=3;,效果是一樣的。例如
>> while (x>1) & (n<1000), n=n+1;
>> if (rem(x,2)) x=3*x+1; else x=x/2; end; end;
>> x=3;獲得答案
>> collaty
>> n
>> x
n = 7 x = 1
整理一下,我們看到腳本程式內的變數與 Matlab 介面內的同名變數, 是同樣的變數。在呼叫 collaty 之前,x 是 3, n 沒有定義。但是 collaty 執行完了之後, x 的值是 1 而 n 的值是 7 (代表 x7 = 1)。
但是,相對地,如果說
>> x=3;獲得答案
>> n=14;
>> collatz(x)
>> n
>> x
這表示 Matlab 介面內定義的變數 x 和 n 與 collatz.m 裡面定義的變數 x 和 n 是沒有關係的!ans = 7 n = 14 x = 3
在腳本中的變數,與介面中的同名變數是通用的, 稱為「全域變數」global variables。 在函式中的變數,與介面中、或者任何其他函式中的任何變數都沒有關係, 稱為「區域變數」local variables。
習題