Matlab 教材:使用者自訂函式

在 M-file 裡面,如果有 function 這個保留字, 它就定義了一個函式,而不是腳本。

凡是使用者自己寫的函式,都叫做使用者自訂函式 (user-defined function)。 寫好了之後,要將那 M-file 存放在目前工作的檔案夾, 或者是搜尋路徑上指定的檔案夾之一,才能使用。 詳情請參考前一節的說明。

我們回顧 [while 迴圈] 那一節寫的腳本程式:

x = 3;
n=0;
while (x>1) & (n<1000)
    n = n+1;
    if (rem(x,2))
        x = 3*x+1
    else
        x = x/2
    end
    pause(1);
end
將它改寫成函式,然後藉它來說明關於函式的基本概念。

如果用 M-file 來儲存函式,最好將 M-file 和函式取同樣的名字, 這樣將來比較容易管理。例如現在我想要寫一個函式 collatz(), 讓它取得一個正整數 x 當作 x0, 做 Collatz 數列 xn,然後輸出使得 xn=1 的最小 n。 那麼我用以下語句「宣告」函式:

function n = collatz(x)
首先,function 是個保留字,表示要宣告函式了。 而 collatz 是這個函式的名字,括號裡的 x 是輸入參數名, 等號左邊的 n 是輸出參數名,學名是「返回變數」(return variable), 簡單地說就是這個函式的「答案」。

輸入參數是從呼叫者 (caller) 那裡傳過來的,通常呼叫者就是 Matlab 的操作介面。 呼叫者傳來一個數,譬如在 Matlab 操作介面下指令 (左邊紅色符號只是代表 Matlab 操作介面的提示號)

>> collatz(3)
則 Matlab 操作介面呼叫了 collatz() 函式,而把 3 傳了過去。 collatz() 獲得 3 之後,就相當於做了
x = 3;
這個指派動作。

因為 x 變數的指派動作已經由呼叫者決定,而被 Matlab 暗中完成了, 所以函式的程式中就不必再寫。因此,整個函式的原始碼就是

function n = collatz(x)
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>1 失敗,也就是 x==1 的時候, while 迴圈停下來,而當時的 n 變數就是所求。 因為 while 迴圈的 end 之後並沒有其他指令, 所以這個函式就自然結束了。 當函式結束的時候,就把當時 n 變數的值回傳給呼叫者,當作答案。

將上述函式儲存在 collatz.m 檔案內, 而將檔案放在目前工作的檔案夾內,Matlab 就可以「看」到它,試試看

>> which collatz
應該會看到 collatz.m 的全名。然後試試看執行
>> collatz(3)
會得到答案 7。這是因為
x0=3, x1=10, x2=5, x3=16, x4=8, x5=4, x6=2, x7=1

習題

  1. 定義 Collatz 數列的「長度」為使得 xk=1 的最小 k。 令 x0 取值 3, 4, ..., 31, 哪一個 x0 導致的 Collatz 數列最長?有多長?
[BCC16-B]
單維彰 (2004/04/29) ---
[Prev] [Next] [Up]