添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
私奔的红烧肉  ·  原位 | Gatan, Inc.·  4 周前    · 
任性的鸡蛋  ·  Python中的内部类(Inner ...·  10 月前    · 

MATLAB 支援二種條件指令(Branching Command,或中譯成「分支指令」),一種是 if-then-else 條件指令,另一種是 MATLAB 在第五版之後開始支援的 switch - case - otherwise 條件指令,以下分述之。

最常用的條件指令是 if - then - else,其使用語法為: if 條件式 運算式一; 運算式二;

當條件式成立時,MATLAB 將執行運算式一,否則,就執行運算式二。若不需使用運算式二,則可直接省略 else 和運算式二。例如:在數值運算的過程中,若變數值為 NaN(即 Not A Number )時,我們要立刻印出警告訊息,可輸入如下:

Example 1: 16-程式流程控制/if01.m x = 0/0;
 if isnan(x)
 disp('Warning: NaN detected!');
 end Warning: NaN detected!
 <p>在上例中,isnan(x) 可用於判斷 x 是否為 NaN,若是,則傳回 1(真),否則即傳回 0(偽)。
 </p><p>在下例中,我們可根據向量 y 的元素值為奇數或偶數,來顯示不同的訊息:
 </p><p><a name="16-程式流程控制/if02"/></p><fieldset><legend>Example 2: <a href="example/16-程式流程控制/if02.m">16-程式流程控制/if02.m</a></legend><xmp class="code">y = [0 3 4 1 6];
 for i = 1:length(y)
 if rem(y(i), 2)==0
 fprintf('y(%g) = %g is even.\n', i, y(i));
 fprintf('y(%g) = %g is odd.\n', i, y(i));
 end y(1) = 0 is even.
 y(2) = 3 is odd.
 y(3) = 4 is even.
 y(4) = 1 is odd.
 y(5) = 6 is even.
 <p>上述的 if - then - else 為雙向條件,亦即程式只會執行「運算式一」或「運算式 二」,不會有第三種可能。
 </p><p>MATLAB 亦可執行多向條件,其使用語法為:
 if 條件式一
 運算式一;
 elseif 條件式二
 運算式二;
 elseif 條件式三
 運算式三;
 運算式四;
 <p>可見若要進行更多向的條件,只需一再重覆 elseif 即可。例如,欲判斷 y 向量之元素是屬於 3n、3n+1、 或 3n+2,可輸入如下:
 </p><p><a name="16-程式流程控制/if03"/></p><fieldset><legend>Example 3: <a href="example/16-程式流程控制/if03.m">16-程式流程控制/if03.m</a></legend><xmp class="code">y = [3 4 5 9 2];
 for i = 1:length(y)
 if rem(y(i),3)==0
 fprintf('y(%g)=%g is 3n.\n', i, y(i));
 elseif rem(y(i), 3)==1
 fprintf('y(%g)=%g is 3n+1.\n', i , y(i));
 fprintf('y(%g)=%g is 3n+2.\n', i , y(i));
 end y(1)=3 is 3n.
 y(2)=4 is 3n+1.
 y(3)=5 is 3n+2.
 y(4)=9 is 3n.
 y(5)=2 is 3n+2.
 <p>我們也可以使用矩陣於條件式中,此時必需在矩陣元素皆不為零時,條件式才算成立。換句話說:「if x, expression; end」完全等效於「if all(x(:)), expression; end」。但是必需注意的是:當 x 是空矩陣時,條件式將永遠不成立。
 </p><p>MATLAB 也支援 switch-case-otherwise 的多向條件指令,其使用語法如下:
 switch expression
 case value(1)
 statement(1)
 case value(2) 
 statement(2)
 case value(n-1)
 statement(n-1)
 otherwise
 statement(n)
 <p>在上述語法中,expression 為一數值或字串,當其值和 value(k) 相等時,MATLAB 即執行 statement(k) 並跳出 switch 指令。若 expression 不等於 value(k),k=1, 2, …, n-1,則 MATLAB 會執行 statement(n) 並跳出 switch 指令。例如:欲根據月份來判斷其季別,可輸入如下:
 </p><p><a name="16-程式流程控制/switch01"/></p><fieldset><legend>Example 4: <a href="example/16-程式流程控制/switch01.m">16-程式流程控制/switch01.m</a></legend><xmp class="code">for month = 1:12
 switch month
 case {3,4,5}
 season = 'Spring';
 case {6,7,8}
 season = 'Summer';
 case {9,10,11}
 season = 'Autumn';
 case {12,1,2}
 season = 'Winter';
 fprintf('Month %d ===> %s.\n', month, season);
 Month 1 ===> Winter.
 Month 2 ===> Winter.
 Month 3 ===> Spring.
 Month 4 ===> Spring.
 Month 5 ===> Spring.
 Month 6 ===> Summer.
 Month 7 ===> Summer.
 Month 8 ===> Summer.
 Month 9 ===> Autumn.
 Month 10 ===> Autumn.
 Month 11 ===> Autumn.
 Month 12 ===> Winter.
 <p>在上例中,我們省略了 otherwise 敘述。如果 expression 是字串,那麼若要在 case 之後比對多個字串,就必需使用字串的異值陣列(Cell Arrey of Strings),例如:
 </p><p><a name="16-程式流程控制/switch02"/></p><fieldset><legend>Example 5: <a href="example/16-程式流程控制/switch02.m">16-程式流程控制/switch02.m</a></legend><xmp class="code">month = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Dec', 'Nov', 'Dec'};
 for i = 1:length(month)
 switch month{i}
 case {'Mar','Apr','May'}
 season = 'Spring';
 case {'Jun','Jul','Aug'}
 season = 'Summer';
 case {'Sep','Oct','Nov'}
 season = 'Autumn';
 case {'Dec','Jan','Feb'}
 season = 'Winter';
 fprintf('%s is %s.\n', month{i}, season);
 end Jan is Winter.
 Feb is Winter.
 Mar is Spring.
 Apr is Spring.
 May is Spring.
 Jun is Summer.
 Jul is Summer.
 Aug is Summer.
 Sep is Autumn.
 Dec is Winter.
 Nov is Autumn.
 Dec is Winter.

Hint
MATLAB 的 switch 指令和 C 語言的 switch 指令略有差別:在 C 語言的 switch 敘述內,每個 case 敘述需加上 break 以跳出該 switch 敘述,而在 MATLAB 則不必多此一舉。

一般而言,switch–case–otherwise 的執行效率優於 if–then–else 。因此,我們應該多多使用 switch–case–otherwise。 MATLAB程式設計:入門篇