Matlab 教材:自訂函式的操作

簡單一句話:使用者自訂函式的操作方式,就和 Matlab 的內建與外掛函式一模一樣。 假設您已經寫好、安裝好前一節示範的 collatz() 函式。 那麼

collatz(3)
得到答案 7,而 Matlab 自動將 7 指派給內建變數 ans, 然後顯示
ans =

     7
您也可以將 collatz() 的答案指派給另一個變數,例如
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 數列長度。

for k=3:15
    p(k) = collatz(k);
end
p 自動被設定成序列變數,足標從 1 開始。 但是我們只指派了 p(3), p(4), ... p(15) 的值, Matlab 自動讓 p(1)p(2) 為 0。 做完了之後說
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

習題

  1. 令 x0=3,4,...,1000, 請統計這些 x0 所對應的 Collatz 數列長度有幾個不同的數? 每個數的出現頻率是多少?並畫出長度頻率之長條圖。 上述這些工作可以寫成一個 M-file 腳本程式。
單維彰 (2004/04/29) --- [Prev] [Next] [Up]