簡單一句話:使用者自訂函式的操作方式,就和 Matlab 的內建與外掛函式一模一樣。 假設您已經寫好、安裝好前一節示範的 collatz() 函式。 那麼
collatz(3)得到答案 7,而 Matlab 自動將 7 指派給內建變數 ans, 然後顯示
您也可以將 collatz() 的答案指派給另一個變數,例如ans = 7
p = collatz(3)則 p 的值就是 7。
而 collatz() 括號內的參數,可以放置任何能夠計算出正整數結果的語句, 例如
collatz(1+2)或者
collatz(floor(sqrt(17)))都可以。前者 1+2,因此 Matlab 呼叫 collatz() 的時候把 3 傳過去,而 collatz() 那邊就相當於做了 x=3; 這個指令。 後者 floor(sqrt(17)) 得到 4, 因此 Matlab 呼叫 collatz() 的時候把 4 傳過去, 而 collatz() 那邊就相當於做了 x=4; 這個指令。
整理一下,就是說呼叫函式的時候,Matlab 會先完成括號裡的計算, 如果那計算有錯,就不呼叫函式而給錯誤訊息。 否則算出答案,把答案的數值傳給函式。
當然,collatz() 括號裡的計算還可以牽涉其他變數, 而 collatz() 的答案也可以儲存到序列或向量變數裡面。 例如以下程式呼叫 collatz() 來計算 x0=3,4,...,15 所對應的 Collatz 數列長度。
p 自動被設定成序列變數,足標從 1 開始。 但是我們只指派了 p(3), p(4), ... p(15) 的值, Matlab 自動讓 p(1) 和 p(2) 為 0。 做完了之後說for k=3:15 p(k) = collatz(k); end
for k=3:15, disp([k,p(k)]); end就會看到對應每個 x0 的 Collatz 數列長度。
最後,很自然地, collatz() 的計算結果也可以當作任何 Matlab 函式的輸入參數。例如
sin(collatz(3)*pi)或者
magic(collatz(3))或者
sum((1:collatz(3)).^2)都是合法的 Matlab 指令。 所以,前面那一段所寫的兩個 for 迴圈其實可以合成一個:
for k=3:15, disp([k,collatz(k)]); end
習題