Matlab 教材:多參數函式

就像數學有「多變數函數」,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 了。

習題

  1. 在這一節裡,您多學到一個內建函式與一個保留字, 請指出來。
  2. 修改這一節的 collatz() 函式, 使得萬一 n 到達 ITER 而 x 尚未出現 1 的話, 正常結束程式並送回答案, 但是顯示一句警告訊息 Warning: number of iteration exceeded.
[BCC16-B]
單維彰 (2004/04/29) ---
[Prev] [Next] [Up]