10/09/2006

3.3 IF條件敘述

條件敘述是一種重要的功能,可以擴大程式判斷的能力。MATLAB最簡單之條件敘述有下面之型式:


if {條件敘述1}
{指令敘述1};
end

if {條件敘述2}
{指令敘述2};
elseif{條件敘述3}
{指令敘述3};
else
{指令敘述4};
end


有關這兩種條件敘述之例子,前面已經有引述。上述條件敘述部份可能為關係式,可能為邏輯判斷值,亦可為邏輯函數的結果,如isreal(A)、isprime(A)等。簡單的邏輯式可以利用關係子給合成為複雜的關係式,但其最後之結果值僅有兩種狀態,即true或 false,或為 0 與1。若結果值不同於1,也視同1考慮。if若成巢狀結構,則必須以end結束。

複合式陳述時,MATLAB並不一定處理全部條件。通常採用部份評估的方式。以if (A&B)為例,只要A的條件評估結果為零時即不再評估B;同理,若為if(AB)時,則只要A為非零之結果,即不再評估B的結果。由於有是項特徵,有些條件陳述可以利用這項功能,如:

if (b~=0) & (a/b>20), …

在此只要(b~=0) 之結果為偽(即b=0),即不會進一步評詁 (a/b>20)這一項,以免造成divide by zero的錯誤。

同理,若條件陳述為

if exist('draw_number.m') & (draw_number(100)>=X)

則第一項為偽時(即檔案draw_number.m不存在時)即不再評估並執行第二項。下面一個例子也是如此,讀者可以自己體會:

if iscell(A) & any(cellfun('isnumeric',A))

下面使用一個抽號的方式作為例子:



function [C]=draw_number(no_of_draw)
% draw ball numbers within ndraw times
%
C=zeros(1,5);
n=1;
while n<=no_of_draw
ball=fix(rand*10);
if ball<2
C(1)=C(1)+1;
elseif ball<4,
C(2)=C(2)+1;
elseif ball<6,
C(3)=C(3)+1;
elseif ball<8,
C(4)=C(4)+1;
else
C(5)=C(5)+1;
end
n=n+1;
end



這是以隨機函數抽號碼球由0至9號分別置於C(1)-C(5)內。看其抽中的號碼分別置入五個箱子中。這個程式完全利用if {}; elseif {};else{};end之型式。最外圍則掛上while…end之迴圈,將在後面討論。執行本程式初期以1000次、5000次及10000次抽到之結果為:

>>[C]=draw_number(1000)
C =
168 209 214 191 218

>>[C]=draw_number(5000)
C =
1010 977 1020 1009 984

>>[C]=draw_number(10000)
C =
2036 2007 1875 2045 2037

依據上項關係得知,抽取到的或然率大概差不多哩!而且即使同樣的抽取次數,其結果亦會有不同,讀者不妨試試。

若以兩矩陣作大小比較時,通常均以元素間之值作比較,但矩陣之大小需相同。下面就實際兩個例子作比較:

>>A=[0 1;2 5], B=[1 0;2 3]
A =
0 1
2 5

B =
1 0
2 3

>>A<B
ans =
1 0
0 0

>>A<B+1
ans =
1 0
1 0

>>A&B
ans =
0 0
1 1

>>A<5
ans =

1 1
1 0

IF之判斷指令可以應用於一般輸入之參數之確定(如前面之evalsum.m程式)或一般變數輸入之交談用。

在此特別強調的一點是,有關"=="與"isequal"這兩個指令之比較。在一般常數間之比較時,此兩個指令之結果應該相同,但在矩陣間比較時,兩個結果可能不同。

>> A==B
ans =
0 0
1 0

>> isequal(A,B)
ans =
0


這種情況也可能發生在其餘類似的指令如 isempty、all、 any等。