Matlab 教材:「腳本」與「函式」之對比

Matlab 的「腳本」與「函式」有三點相同:

例如
>> type trace
看到 trace() 的原始碼: 其實,除掉線上說明和註解之外,這個函式只有一句話。 同理,
>> type collatz
應該會看到 collatz() 的原始碼,包括其註解在內。 但是如果說
>> type sum
Matlab 就很掃興地跟您說 sum() 是內建函式, 不讓您看原始碼 (其實內建函式的原始碼是用 C 語言寫的)。

「腳本」與「函式」的最大不同就在於變數的處理方式。 現在假設 [使用者自訂函式] 那一節寫的函式放在 collatz.m 裡面,而我們修改 [while 迴圈] 那一節寫的腳本程式,如下

n=0;
while (x>1) & (n<1000)
    n = n+1;
    if (rem(x,2))
        x = 3*x+1;
    else
        x = x/2;
    end
end
放在 collaty.m 裡面。 而兩個檔案都在目前工作的檔案夾內。

表面上的不同,是 collatz() 的參數 x 是從 Matlab 介面傳送過去的, 但是 collaty 的參數 x 沒有出現在 collaty.m 檔案裡面。

「腳本」有點像「巨集」,當您在 Matlab 介面中執行

>> collaty
其實就好像您將 collaty.m 裡面的指令一句一句輸入給 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
當然如果是直接輸入在 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;
不論如何,您可以看到,即使 x 沒有寫在 collaty.m 裡面, 只要在執行 collaty 先執行 x=3;,效果是一樣的。例如
>> 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
獲得答案
ans =
 
     7
 
n =
 
    14
 
x =
 
     3
這表示 Matlab 介面內定義的變數 xncollatz.m 裡面定義的變數 xn 是沒有關係的!

在腳本中的變數,與介面中的同名變數是通用的, 稱為「全域變數」global variables。 在函式中的變數,與介面中、或者任何其他函式中的任何變數都沒有關係, 稱為「區域變數」local variables

習題

單維彰 (2004/04/29) --- [Prev] [Next] [Up]