就像數學有「多變數函數」,Matlab 也有「多參數函式」。 例如當 A 是個矩陣的時候, sum(A) 是將 A 的元素逐行相加。 其實您可以下指令
sum(A,2)獲得逐列相加的結果,而 sum(A,1) 就跟 sum(A) 效果一樣。 所以 sum() 可以接受兩個參數。 更厲害的是,sum() 可以接受一個「或」兩個參數! 如果 sum() 發現使用者只給了一個參數,就自動設定第二個參數的值; 換句話說,sum(A) 就等於 sum(A,1)。
這是 Matlab 語言比其他大多數程式語言 (例如 C 語言) 方便的地方。
使用者自訂函式也可以享受這種便利。 繼續以 collatz.m 為例,我們修改它, 讓使用者可以自己決定最多迭代次數。 以前,我們寫
while (x>1) & (n<1000)亦即最多迭代次數是 1000, 但是以下程式令最多迭代次數為 ITER, 讓使用者有機會指定 ITER,如果沒有指定,才設定 ITER=1000。
整個原始碼寫在這裡,為了方便閱讀,我們將新加入的原始碼用藍色字型顯示。
function n = collatz(x, arg2) % Usage: collatz(x, [arg2]) % Here x is a positive integer, let it be x_0 and generate the % Collatz sequence until the first n such that x_n = 1. Return n. % arg2, which is optional, specifies the max number of iterations. % % Shann 2004-04-29 % Check input if (nargin == 2) ITER = arg2; elseif (nargin == 1) ITER = 1000; else disp(['Error: must have one or two input arguments.']); return; end % Input validation: is a scalar, is an integer, is positive. if (length(x) > 1) disp(['Error: input must be a scalar.']); return; end if (floor(x) ~= x) disp(['Error: input must be an integer.']); return; end if (x < 1) disp(['Error: input must be a positive integer.']); return; end % Let x be x_0, start the Collatz sequence x_n, n=1,2,3... % until the first x_n = 1 n=0; while (x>1) & (n<ITER) n = n+1; if (rem(x,2)) x = 3*x+1; else x = x/2; end end
首先,在宣告的時候,我們令 collatz() 可能獲得第二個參數, 給它取個簡單的名字 arg2 (argument 2)。 然後在線上說明文字中解釋 arg2 的意義。
主要的改變在原始碼的第二段,我們使用 Matlab 內建函式 nargin() (number of input arguments) 來詢問真正傳來了幾個參數? 如果是 2 個,令 ITER=arg2, 否則檢查是否傳來 1 個參數,如果是的話就沒有 arg2, 所以令 ITER=1000。 如果連一個都沒有傳來,就是錯誤,中斷函式。
其實 nargin() 並不需要任何參數, 因此使用的時候不需要寫括號。 但是我還是寫 nargin(), 那一對空括號只是一種書寫的習慣,表示 nargin 是函式而不是變數、也不是保留字。
最後我們把 (n<1000) 改成了 (n<ITER)。 完工。存檔之後,試試看
>> collatz(3)答案還是 7,而
>> collatz(3,100)答案也是 7。不過
>> collatz(3,5)答案就變成 5 了。
習題