所謂迭代,就是高潮迭起的「迭」和變數代換的「代」。 概念上,就是有某個變數,它的值被一次又一次地代換成新的數值, 而每次代換之後都做同樣的動作。 通常程式語言提供三種迭代的語法: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 這種形式的指令置換。 這是一個常用技巧。譬如要計算
s = 0;當然,上述指令不必全部輸入十遍,只要配合 Matlab 的指令編輯功能, 用向上箭頭把前一個指令叫出來修改就好了。
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 的函式, 把所要計算的問題,用向量或矩陣物件來思考。例如上述問題只要說
sum(1:10)就解決了。
雖然 sum(1:10) 是最美妙的作法,我們現在要利用這個簡單問題來學習迭代技巧。 用 for 迴圈來計算 1+2+3+...+10,想法卻和第一種方法相同,只是技巧更高了:
s = 0;前面有些指令用分號 ; 結尾,那是「默默地做」的意思 (silent command), 也就是要 Matlab 執行計算或變數指派,但是不把計算結果或變數值印出來。 我們已經在相逢篇之 [變數之指派與計算] 看過它。 前述的 for 迴圈那一句,就相當於一直按向上的箭頭那樣。 只是現在不必按向上的箭頭,也不必編輯指令, Matlab 執行 s = s+i 這句指令十遍,每一遍分別代入不同的 i 值。
for i=1:10, s = s+i, end
最後,我們要提醒三件事:
習題
1 + 1/(2^2) + 1/(3^2) + ... + 1/(100^2)
1 + 1/(2^2) + 1/(3^2) + ... + 1/(100^2)