10/09/2006

3.4 FOR 迴圈之應用

通常for的迴圈都用在重覆執行固定次數的場合,其運算過程中雖亦可利用條件跳出迴圈,但仍以其設定之次數為上限,迴圈每循環一次稱為一回合。其中之expression 通常以純量表示,其型式如k=1:5、K=2:4:20等,等號右邊之最左值為初值,最後值為末值,有中間值時則為每回合之增量。在 MATLAB中 for 迴圈之型式如下:


for var = expression
{statements};
end


例如:



x=0, %先將x矩陣清為零,再進行迴圈
for i = 1:5,
  x(i) = i^2,
end;


x = 0
x = 1
x = 1 4
x = 1 4 9
x = 1 4 9 16
x = 1 4 9 16 25

由這個迴圈之運作,至少可以看出x列向量之大小逐漸因執行過程而擴大的情形。上述迴圈亦可寫成:

>>for i = 1:5, x(i) = i^2, end

但要先記得清除變數x,以免變數有殘餘值。即

>>clear x

若改成遞減的方式亦有同樣的結果:

>>x=0;for i = 5:-1:1, x(i) = i^2, end

x = 0 0 0 0 25
x = 0 0 0 16 25
x = 0 0 9 16 25
x = 0 4 9 16 25
x = 1 4 9 16 25


只是此時之x已先設定為1x5之向量,因為開始時x=5。

使用這種遞圈的觀念亦很容易產生向量矩陣,例如:

>>x=1:1:10
x =
1 2 3 4 5 6 7 8 9 10

這表示產生一個序列向量,起始值為1,增量為1,直到10為止。若增量為1個單位時,上述x向量亦可用x=1:10產生。而增量改為負值時,其順序應相反:

>>x=10:-1:1
x =
10 9 8 7 6 5 4 3 2 1

巢狀迴圈亦常使用,下面是產生修伯特矩陣(Hilbert matrix)的方式:



%hillbert.m for demonstration
%
h=5;
A=zeros(h,h); %預留空間
for k=1:h
for m=1:h
A(k,m)=1/(k + m -1);
end
end
A


>>hillbert
A =
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 0.3333 0.2500 0.2000 0.1667
0.3333 0.2500 0.2000 0.1667 0.1429
0.2500 0.2000 0.1667 0.1429 0.1250
0.2000 0.1667 0.1429 0.1250 0.1111

實際上,初值亦可為向量,然後依序計算:

>> for i=[2 18 3 1], x=i^3,end

x = 8
x = 5832
x = 27
x = 1


比較深入之運用,for後面之陳述也可以使用矩陣,只是每次以該矩陣之行向為單位,一行一行地執行,如


>>eye(3)

ans =

1 0 0
0 1 0
0 0 1

>> for m=eye(3)*3, m, end
m =
3
0
0
m =
0
3
0
m =
0
0
3


由於eye(3)是一個單位矩陣(對角線元素均為1其餘為0),故每回合所得之m值為其行向量值。在特別情況下,讀者也可以利用這項功能。這與下面之執行結果略有不同。


>> m=eye(3)*3
m =
3 0 0
0 3 0
0 0 3