Matlab 教材:用 Matlab 認識迭代概念

所謂迭代,就是高潮迭起的「迭」和變數代換的「代」。 概念上,就是有某個變數,它的值被一次又一次地代換成新的數值, 而每次代換之後都做同樣的動作。 通常程式語言提供三種迭代的語法:for 迴圈、while 迴圈和 do-until 迴圈。 在此我們先講 for 迴圈 (for-loop)。 技術上,我們要學習各種程式語言所提供的迭代語法。 迭代這個概念首次出現於 Babbage 和 Ada 在設計機械型計算機的時候, 這是寫一個電腦程式最最基本、可能也是最最原始的技巧。

Matlab 提供一套程式語言,它的程式語言也有 for 迴圈功能。 它的語法是

for 變數 = 向量或序列, 計算, end
舉例來說,如果
v = [0 1 2 3]
是個序列,那麼
for x = v, 計算, end
就將變數 x 依序代入 v 的第一個、第二個、第三個、第四個元素, 每一次代入之後,就做一次計算,直到每個 v 的元素都被代入一次為止。

先介紹 disp( ) 函式,這就是把一個變數的值印出來的意思。 說變數的名字也可以把變數的值印出來,只是此時 Matlab 會複誦變數的名字, 而 disp( ) 不複誦變數的名字。試試看

v
disp(v)

舉一個最初步的例子,以下程式將 x 的數值一個一個印在螢幕上:

for x = [0 1 2 3], disp(x), end
我們看到 Matlab 依序把 0, 1, 2, 3 代入 x,代入之後就執行同一個指令 disp(x), 直到 [0 1 2 3] 序列內的每個元素都被代入一次為止。

for 迴圈的變數不一定只能代入整數,可以代入任何常數,例如

for x = [0 pi/6 pi/4 pi/3 pi/2], disp(x), end
稍微不無聊一點,以下程式印出正弦函數在某些特殊角的值:
for x = [0 pi/6 pi/4 pi/3 pi/2], disp([x sin(x)]), end
排得不是很整齊,先不要管這個細節了。

最後再看一個基本例子。以下程式印出相對應的一些攝氏、華氏溫度:

for c = [0 5 10 15 20 25 30 35 40], disp([c 32+9*c/5]), end
其實,利用冒號指令,我們可以寫得更簡潔:
for c = 0:5:40, disp([c 32+9*c/5]), end

我們曾經學過,變數的值可以被類似 x = x+1 這種形式的指令置換。 這是一個常用技巧。譬如要計算

1 + 2 +3 + ... + 10
可以說
s = 0;
s = s+1
s = s+2
s = s+3
s = s+4
s = s+5
s = s+6
s = s+7
s = s+8
s = s+9
s = s+10
當然,上述指令不必全部輸入十遍,只要配合 Matlab 的指令編輯功能, 用向上箭頭把前一個指令叫出來修改就好了。

後來我們又學到,像上述問題,根本不需要做十遍,而是應該善用 Matlab 的函式, 把所要計算的問題,用向量或矩陣物件來思考。例如上述問題只要說

sum(1:10)
就解決了。

雖然 sum(1:10) 是最美妙的作法,我們現在要利用這個簡單問題來學習迭代技巧。 用 for 迴圈來計算 1+2+3+...+10,想法卻和第一種方法相同,只是技巧更高了:

s = 0;
for i=1:10, s = s+i, end
前面有些指令用分號 ; 結尾,那是「默默地做」的意思 (silent command), 也就是要 Matlab 執行計算或變數指派,但是不把計算結果或變數值印出來。 我們已經在相逢篇之 [變數之指派與計算] 看過它。 前述的 for 迴圈那一句,就相當於一直按向上的箭頭那樣。 只是現在不必按向上的箭頭,也不必編輯指令, Matlab 執行 s = s+i 這句指令十遍,每一遍分別代入不同的 i 值。

最後,我們要提醒三件事:

  1. 我們習慣用 i, j, k, m, n 這些字母當作迭代的變數。 不過,記得 Matlab 認識複數嗎?其實 i 原本是 sqrt(-1) 的意思。 一旦你說了 for i=1:2:100 這句,執行之後,i 的值就是 99。 因為我們把 1:2:100 這個向量的元素一個一個代入 i,而最後一個是 99。 如果要讓 i 恢復單位虛數,就說 i = sqrt(-1) 或者 i=complex(0,1) 都可以。
  2. 在迴圈中我們寫 s = s+i; 注意那個分號, 它使得計算過程中的 s 數值不會印出來。我們沒必要看到那一大堆中間步驟的答案。
  3. 處理這一類問題,sum(1:2:100) 才是 Matlab 的王道。 我們在此只是利用這類問題來解釋 for 迴圈的語法和技巧而已。

習題

  1. 用 for 迴圈計算從一到一百的倒數平方和。亦即
    1 + 1/(2^2) + 1/(3^2) + ... + 1/(100^2)
  2. 用 for 迴圈計算從一到一百的倒數平方和。亦即
    1 + 1/(2^2) + 1/(3^2) + ... + 1/(100^2)
[BCC16-B]
單維彰 (2003/04/15) ---
[Prev] [Next] [Up]