計算機程式就是計算機指令的集合,不同的程式設計語言指令與功能是不一樣的.MATLAB語言是一種面向對象的進階語言,它具有程式設計效率高、易學易用的優點.
MATLAB與其它大部分進階語言一樣,有它自己的控制流語句.控制流極其重要,因為它使過去的計算影響将來的運算。MATLAB提供如下幾種控制流結構:For循環,While循環,If-Else-End結構和switch-case-end結構。由于這些結構經常包含大量的MATLAB指令,故經常出現在M檔案中.MATLAB支援的控制流語句和C語言支援的控制流語句在調用格式上非常相似.
1.For 循環
For循環允許一條語句或一組語句被重複執行預先指定的次數。For循環的一般形式是:
for x = array
語句
end
在for和end語句之間的語句按數組中的每一列執行一次。在每一次疊代中,x被指定為數組的下一列,即在第n次循環中,x=array(:, n)。例如,
for n=1:10
x(n)=sin(n*pi/10);
end
x
x =
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 0.5878 0.3090 0.0000
換句話,第一語句是說:對n等于1到10,執行所有語句,直至下一個end語句。第一次通過For循環n=1,第二次,n=2,如此繼續,直至n=10。在n=10以後,For循環結束,然後執行end語句後面的任何指令.注意,該循環結束後,n=10.
For循環的其它重要方面是:
(1)For循環不能用For循環内重新指派循環變量n來終止。
for n=1:10
x(n)=sin(n*pi/10);
n=9;
end
x
x =
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 0.5878 0.3090 0.0000
n
n=
9
執行過程是這樣的:
n=1,
x(1)=sin(pi/10),
n=9,
n=2,
x(2)=sin(2*pi/10),
n=9,
n=3,
...,
n=10,
x(10)=sin(10*pi/10),
n=9.
循環結束後,n=9.
(2)在For循環内接受任何有效的MATLAB數組。
data=[3 9 45 6; 7 16 -1 5]
data =
3 9 45 6
7 16 -1 5
for n=data
x=n(1)-n(2)
end
x =
-4
x =
-7
x =
46
x =
1
(3)For循環可按需要嵌套。
for n=1:5
for m=1:5
A(n,m)=n^2+m^2;
end
disp(n)
end
1
2
3
4
5
A
A =
2 5 10 17 26
5 8 13 20 29
10 13 18 25 34
17 20 25 32 41
26 29 34 41 50
(4)當有一個等效的數組方法來解給定的問題時,應避免用For循環。例如,上面的第一個例子可被重寫為
n=1:10;
x=sin(n*pi/10)
x =
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 0.5878 0.3090 0.0000
兩種方法得出同樣的結果,而後者執行更快,更直覺,要求較少的輸入。
(5)為了得到最大的速度,在For循環(While循環)被執行之前,應預先配置設定數組。例如,前面所考慮的第一種情況,在For循環内每執行一次指令,變量x的大小增加1。迫使MATLAB每通過一次循環要花費時間對x配置設定更多的記憶體。為了消去這個步驟,For循環的例子應重寫為
x=zeros(1,10);
for n=1:10
x(n)=sin(n*pi/10);
end
現在,隻有x(n)的值需要改變。
例1 相傳古代印度國王要褒獎他的聰明能幹的宰相達依爾(國際象棋發明者),問他要什麼?達依爾回答:“陛下隻要在國際象棋棋盤的第一個格子上放一粒麥子,第二個格子上放二粒麥子,以後每個格子的麥子數都按前一格的兩倍計算。如果陛下按此法給我64格的麥子,就感激不盡,其他什麼也不要了。”國王想:“這還不容易!”讓人扛了一袋麥子,但很快用光了,再扛出一袋還不夠,請你為國王算一下共要給達依爾多少小麥?(1小麥約顆)
解 麥粒總數為
程式如下:
a=1;
s=0
for i=1:64
s=s+a;
a=2*a;
end
s=s/1.4/10^8
運作後得:
s=
1.3176e+011
例2 公元前五世紀我國古代數學家張丘建在《算經》一書中提出了“百雞問題”:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、母、雛各幾何?
解 設 x:雞翁數,則x的範圍:0~19
y:雞母數,則y的範圍:0~33
z:雞雛數,則z的範圍:0~100
則:
x+y+z=100
5x+3y+z/3=100
這是一個不定方程。
for x=0:19
for y=0:33
for z=0:100
if (x+y+z==100)&(5*x+3*y+z/3==100)
d=[x,y,z]
end
end
end
end
運作後得結果:
d =
0 25 75
d =
4 18 78
d =
8 11 81
d =
12 4 84
2.While 循環
與For循環以固定次數求一組指令的值相反,While 循環以不定的次數重複執行一組語句。While循環的一般形式是:
while 表達式1
語句1
end
隻要表達式1裡的所有元素為真,就執行while和end之間的語句1,否則,就結束循環。通常,表達式的值給出一個标量值,但數組值也同樣有效。在數組情況下,當數組的所有元素為真(值不等零)時,就執行語句1,數組中有一個元素為假(值為零),就結束循環。
例3 按下面的公式計算:
使誤差小于給定的.
解 把作為誤差,程式如下:
error=input('請輸入誤差:');
x=1;
y=0;
n=1;
while x>error
y=y+1;
x=x/n;
n=n+1;
end
e=y
運作如下:
請輸入誤差:0.001
e =
2.7181
3.IF-ELSE-END 結構
很多情況下,指令的序列必須根據關系的檢驗有條件地執行。在程式設計語言裡,這種邏輯由某種If-Else-End結構來提供。最簡單的If-Else-End結構是:
if 表達式1
語句1
end
如果在表達式1中的所有元素為真(非零),那麼就執行if和end語言之間的語句1。
假如有兩個選擇,If-Else-End結構是:
if 表達式1
語句1
else
語句2
end
在這裡,如果表達式1為真,則執行語句1;如果表達式是假,則執行語句2。
當有三個或更多的選擇時,If-Else-End結構采用形式
if 表達式1
語句1
elseif 表達式2
語句2
elseif 表達式3
語句3
elseif 表達式4
語句4
elseif ……
.
.
.
else
語句
end
如果表達式1為真,則執行語句1,結束循環;如果表達式1為假,則檢驗表達式2,如果表達式2為真,則執行語句2,結束循環;如果表達式2為假,則檢驗表達式3,如此下去,如果所有表達式都為假時,則執行最後的語句。即隻執行第一個真值表達式相關的語句;接下來的表達式不檢驗,跳過其餘的If-Else-End結構。而且,最後的else指令可有可無。
4.switch-case-end結構
如果在一個程式中,必須針對某個變量不同取值情況進行相應操作,switch語句比if else語句更友善。switch語句的一般形式為:
switch 分支條件(數值或字元串)
case 數值(或字元串)條件1
語句1
case 數值(或字元串)條件2
語句2
case 數值(或字元串)條件3
語句3
case ...
...
otherwise
語句
end
其中分支條件可以是一個函數、變量或者表達式.如果條件1與分支條件比對就執行語句1,退出循環;否則,檢驗條件2,如果條件2與分支條件比對執行語句2,退出循環;否則,檢驗條件3,...,當所有條件都不與分支條件比對時就執行最後的語句。注意otherwise是可以省略的。
例4 在圖形界面上放置一個彈出式菜,點選彈出式菜單可以設定曲線顔色。
解:程式如下:
x=linspace(-6,6,50);
y=sin(x);
h=plot(x,y,'linewidth',4);
h0=uicontrol('position',[600,500,100,30],...
'style','popupmenu',...
'string','紅色|藍色|黃色|黑色|青色',...
'callback',...
['v=get(h0,''value'');',...
'switch v;',...
'case 1;',...
'set(h,''color'',''r'');',...
'case 2;',...
'set(h,''color'',''b'');',...
'case 3;',...
'set(h,''color'',''y'');',...
'case 4;',...
'set(h,''color'',''k'');',...
'case 5;',...
'set(h,''color'',''c'');',...
'end;']);