這次的主題是流程控制,也就是要介紹 if , else if, else 和 for, while 的用法,這些都是在自訂 function 時,非常重要的語法,那麼筆者先從 if 開始介紹


if  
Matlab 的執行順序是由上而下,一行行的 code 依序執行下來,但如果想要有些運算在滿足某些條件時,才做執行,該怎麼辦呢 ? 如果 Matlab 一律無條件由上而下一行行的 code 執行下來,那就真的束手無策了,這時候就顯示出 if 的重要啦,if 只有在旁邊的條件式中的條件滿足時,才會執行 if 下方對應的運算式,請見下方例子: 
%以下範例檢查 x 變數值的範圍,小於100的話, y 的值會是 x is smaller than 100;大於100的話,y 的值會是x is bigger than 100
>>x = 66;

% x < 100為條件式,y = "x is smaller than 100"是運算式
>>if x < 100  
         y = "x is smaller than 100";
     end

% x > 100為條件式,y = "x is bigger than 100"是運算式
>>if x > 100
          y = "x is bigger than 100";
     end

>>y
y = 
        "x is smaller than 100"

條件式
在上面的例子中, 你看到了 > (大於), < (小於),這兩個運算子,Matlab 當然還有其他用於其他比較的運算子,像是 >= (大於等於), <=(小於或等於), ==(相等),如果你想在條件式中同時寫兩個以上的條件,&& (AND)和 || (OR) 則會是你的好幫手,用法請見下面的範例:
>>x = 66;
%條件式 : x 大於100或 x 小於100其中一條件成立即可
>>if x < 100 || x > 100
         y = " OR( || ) condition is True";
     end
>>y
y=
       " OR( || ) condition is True";      %條件成立

%接下來我把條件改為 x < 100 並且(&&) x > 100
>>if x < 100 && x > 100
         y = " AND( && ) condition is True";
     end
>>y
y=
       " OR( || ) condition is True";     %條件不成立,y值維持不變

%從上面能觀察出 || 只要其中一條件成立即可,但是 && 需要所有串連的條件都達成才行

else if 及 else
在 if 和 else if 旁都有條件式,同樣在條件式中的條件成立時,對應的運算式才會被執行,若是條件不成立的話,則會找下一層的 else if 開始判斷條件,重復這個流程直到所有的 if 和 else if 的條件都不成立時,才會執行 else 下的運算式
%下面的例子是在判斷x的範圍,很明顯的,在 x > 50時條件會成立
x = 66;
>>if x > 100
          y = "x > 100";
  elseif x > 50      %elseif本身就會加上與前面幾層if/elseif的互斥條件,所以這個elseif的條件式也等價 x <= 100 && x > 50      
          y = "50 < x <=100";
  elseif x > 0       %條件等價 x <= 50 && x > 0               
          y = "0 < x <= 50";
  else               %條件等價 x <= 0
          y = "x <= 0"; 
  end
>>y
y=
       "50 < x <=100"

%許多新手常犯的觀念錯誤是在執行完運算式後,以為程式會繼續判斷下一層的elseif,造成結果不如預期,實際上,
%同一組if-elseif-else只要一有條件成立的話,執行完對應的運算式後,就會離開這組if-elseif-else了

看到這裡,你可能會想,難道每次使用時, if, else if, else 三者都要齊聚才能 work 嗎?當然不是,事實上,一般使用時通常只會用到 if 和 else 而已,有時甚至是只用 if 就好了, else if 視需求才會拿出來用,當然,else if 的個數也是能自由調整的,到此 if 的用法就教完啦,讓我們邁向迴圈的懷抱吧~

for
迴圈提供重複多次執行一段code的能力,筆者先介紹 for 語法,既然是多次執行,那就一定需要設定停止重複的條件,讓我們先看到下面的例子
>>for  i = [1 9 22]
         i                   %運算式
     end
i =
         1
i =
         9
i =
         22
% for 會使旁邊的變數一一取出陣列的每一個 element,並且每取出一個就執行一次運算式,因此在上面的例子中,i的內容才會被印出三次,並且每次都剛好對應到陣列內容
%因此,我們掌握到 for 的運算式執行次數是跟陣列的 element個數相同,由此我們可以設計出我們需要的功能

看了剛才的範例,你很快會發現一個問題,那如果我需要 for 執行非常多次的時候,豈不是需要一個非常長的陣列,但是手動創立的話也太辛苦了吧,這時候就可以利用 : (冒號) 來幫助我們了
>>1:10
 1 2 3 4 5 6 7 8 9 10  %從這你可以觀察到, : 可以快速的創造並設定陣列的內容
% : 的功用其實是創造一內容為等差數列的陣列,所以僅需給予起使值、終止值還有變量即可
% 例如筆者想要造 1 個陣列,內容為1~11的奇數
>>1:2:11       % : 用法 起使值:變量(變量為1時可省略):終止值
 1 3 5 7 9 11 

% 現在讓我們應用到 for 迴圈上,筆者利用 for 記算 1 + 2 + 3 +...+ 499 + 500
>>temp_sum = 0;
>>for a = 1:500
         temp_sum = temp_sum + a;
     end
>>temp_sum
temp_sum = 
         125250

while
如果在不確定迴圈執行次數時,while 就是比起 for 更適合的人選,舉個簡單的例子,我想在陣列中找到第一個負數,這種案例就無法確定迴圈要執行幾次才會找到,code 如下,大家可以體會一下
a = [5 3 14 10 -1 -8];
i = 1;
while a(i) >= 0
         i = i + 1;
 end
>>i
i = 
         5
>>a(i)
a(i) = 
         -1
% while 的結構如下,在條件式被滿足的情況下,while會不斷執行其中的運算式,直到條件式不成立,
% 上面的範例從a(1)開始檢查是否為正數,是的話就將 i 加一,以檢查下一個陣列 element,而到了
% i = 5 時, while發現 a(5) 是負數,因此跳出 while 迴圈,我們就能透過 i 來查看第一筆負數的 index 及數值是多少
%while 結構 : 
 while 條件式
      運算式
 end

在上面的範例中,你會一直看到 end 這個字,它基本上是來介定運算式的範圍,這也是告訴你運算式並沒有規定只能寫一行,雖然筆者舉的例子都是指有一行,但那是為了易於理解,所以大家別被混淆了,那麼這次的教學就到這裡結束,如果發現有錯誤,歡迎告知,這次的內容對程式新手來說,要多練習才能上手,有問題也歡迎發問,大家加油啦~


Post a Comment

較新的 較舊