張智星 jang@cs.nthu.edu.tw http://www.cs.nthu.edu.tw/~jang 清大資工系 多媒體檢索實驗室 MATLAB 程式設計入門篇 程式流程控制 張智星 jang@cs.nthu.edu.tw http://www.cs.nthu.edu.tw/~jang 清大資工系.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

教师手册 教师职业守则(全体教师) 中文教学工作细则(中文、双语教师) 中文教师业绩评估(中文、双语教师)
張智星 清大資工系 多媒體檢索實驗室 MATLAB 程式設計進階篇 程式計時 張智星 清大資工系.
MATLAB 程式設計 時間量測 清大資工系 多媒體資訊檢索實驗室.
丁 频 农业及食品饮料行业高级分析师 贺菊颖 中药行业分析师 王友红 化学制药及生物制药行业分析师 路 颖 商业贸易行业首席分析师 1.
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
迴圈 迴圈基本觀念 while迴圈 do 迴圈 for迴圈 巢狀迴圈 迴圈設計注意事項 其他控制指令 迴圈與選擇的組合.
淡水泉投资:安全稳健低回撤 长期业绩卓著 产品基本信息 基金经理简介 产品全称 银河证券-盘晟淡水泉成长1号 基金经理 赵军 受托人
全面预算管理培训 北大纵横管理咨询公司 2003年10月.
第 5 章 流程控制 (一): 條件分支.
認識拿破崙˙波拿巴 關於一位運氣很差的矮子的趣事兩三件 我不是矮子!! 本日主角 重點不是這個吧? 惡搞人員:橘蘋3顆和一隻小精靈.
第四章 數列與級數 4-1 等差數列與級數 4-2 等比數列與級數 4-3 無窮等比級數 下一頁 總目錄.
條件判斷 授課:林哲嘉 日期:2009/3/4.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
張智星 台大資工系 多媒體檢索實驗室 第二章 程式控制結構 張智星 台大資工系 多媒體檢索實驗室.
MATLAB簡介 MATLAB程式設計《入門篇》
Chapter 5 迴圈.
MATLAB介紹.
C++Primer 3rd edition 中文版 Chap 5
張智星 (Roger Jang) 清大資工系 多媒體檢索實驗室
第四章 流程控制(一) if,if-else 與 switch
增员有方 L区 特别事务助理总监陈蕴梅 ACS ALS.
C 程式設計— 控制敘述 台大資訊工程學系 資訊系統訓練班.
MATLAB 程式設計入門篇 與Excel試算表的整合
4B冊 認識公倍數和最小公倍數 公倍數和最小公倍數的關係.
新觀念的 VB6 教本 第七章 讓程式轉彎的控制敘述.
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
PHP 程式流程控制結構.
程式流程控制 方煒 台大生機系.
研究地月距離的變化.
電腦解題─流程圖簡介 臺北市立大同高中 蔡志敏老師.
邏輯關係運算 == 等於 & 且 (logical and) ~= 不等於 | 或 (logical or) < 小於
Chap3 Linked List 鏈結串列.
Introduction to MATLAB
范洪源 臺灣師範大學數學系 分支宣告與程式設計 范洪源 臺灣師範大學數學系.
程式設計實習課(四) ----C 函數運用----
P ANNUAL REPORT DESIGN BY PENELOPE ENTER THE TIME
第一單元 建立java 程式.
分支宣告與程式設計 黃聰明 國立臺灣師範大學數學系
MATLAB介绍 Matlab基本命令介绍 Matlab矩阵运算 Matlab控制流 Matlab图像处理工具箱 实习题讲解.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
義守大學電機工程學系 陳慶瀚 第4章 VHDL Sequential語法 義守大學電機工程學系 陳慶瀚
Peking University SAS Club
張智星 清大資工系 多媒體檢索實驗室 MATLAB 程式設計進階篇 線性代數 張智星 清大資工系.
MATLAB 程式設計入門篇 二維平面繪圖 (part2)
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
JAVA 程式設計 資訊管理系 - 網路組.
第二单元 第2课 Matlab程序控制结构 1.顺序结构 2.选择结构 3.循环结构.
輸入&輸出 函數 P20~P21.
5 重複迴圈 5.1 增減運算符號 增量運算符號 減量運算符號
張智星 清大資工系 多媒體檢索實驗室 Tree Net Construction 張智星 清大資工系.
CH05. 選擇敘述.
期末考.
撰寫MATLAB基礎財務程式 柯婷瑱.
挑戰C++程式語言 ──第8章 進一步談字元與字串
微積分 第二次上機 Matlab 教學 2007/10/30 陳逸嬿.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
第 四 章 迴歸分析應注意之事項.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
11月份豆油价格区间震荡 宏源期货农产品团队 张磊 2011年10月29日.
( )下列何者正確? (A) 7< <8 (B) 72< <82 (C) 7< <8 (D) 72< <82 C 答 錯 對.
Do While 迴圈 東海大學物理系‧資訊教育 施奇廷.
期末報告第一題 通訊四甲 B 湯智瑋.
迴圈(重複性結構) for while do while.
適用於多選一 可減少if 與 else配對混淆的錯誤.
MATLAB 結構化財務程式之撰寫 MATLAB財務程式實作應用研習 主題五 資管所 陳竑廷
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
11621 : Small Factors ★★☆☆☆ 題組:Problem Set Archive with Online Judge
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Presentation transcript:

張智星 jang@cs.nthu.edu.tw http://www.cs.nthu.edu.tw/~jang 清大資工系 多媒體檢索實驗室 MATLAB 程式設計入門篇 程式流程控制 張智星 jang@cs.nthu.edu.tw http://www.cs.nthu.edu.tw/~jang 清大資工系 多媒體檢索實驗室

16-1 迴圈指令 MATLAB 提供兩種迴圈指令,一種是 for 迴圈(For Loop),另一種是 while 迴圈(While Loop)。 for 迴圈的使用語法如下: for 變數 = 向量, 運算式 end 其中變數的值會被依次設定為向量的每一個元素值,來執行介於 for和 end 之間的運算式。 另一種 for 迴圈的使用語法如下:for 變數 = 矩陣, 此時變數的值會被依次設定為矩陣的每一個直行,來執行介於 for 和 end 之間的運算式。 while 迴圈使用語法如下: while 條件式 運算式;

程式流程控制之範例一 下列 for 迴圈會產生一個長度為 6 的調和數列(Harmonic Sequence): 範例16-1 : forLoop01.m x = zeros(1,6); % 變數 x 是一個 1×6 大小的零矩陣 for i = 1:6 x(i) = 1/i; end x % 顯示 x x = 1.0000 0.5000 0.3333 0.2500 0.2000 0.1667 在上例中,矩陣 x 最初是一個 1×6 大小的零矩陣,在 for 迴圈中,變數 i 的值依次是 1 到 6,因此矩陣 x 的第 i 個元素的值依次被設為 1/i。 我們接著可用分數形式來顯示此數列: >> format rat % 使用分數形式來顯式數值 >> disp(x) 1 1/2 1/3 1/4 1/5 1/6

程式流程控制之範例二 for 迴圈可以是多層或巢狀式(Nested)的,在下例中即產生一個 6×6 的Hilbert 矩陣 h,其中為於第 i 列、第 j 行的元素為 : 範例16-2 : forLoop02.m h = zeros(6); % 變數 x 是一個 6×6 大小的零矩陣 for i = 1:6 for j = 1:6 h(i,j) = 1/(i+j-1); end format rat % 使用分數形式來顯式所有數值 h % 顯示 h h = 1 1/2 1/3 1/4 1/5 1/6 1/2 1/3 1/4 1/5 1/6 1/7 1/3 1/4 1/5 1/6 1/7 1/8 1/4 1/5 1/6 1/7 1/8 1/9 1/5 1/6 1/7 1/8 1/9 1/10 1/6 1/7 1/8 1/9 1/10 1/11

程式流程控制之範例三 在下例中,for 迴圈列出先前產生的 Hilbert 矩陣的每一直行的平方和: 範例16-3 : forLoop01.m format short % 回到預設形式來顯式所有數值 for i = h disp(norm(i)^2); % 印出每一行的平方和 End 1.4914 0.5118 0.2774 0.1787 0.1262 0.0944 在上例中,由於 h 是一個矩陣,因此每一次 i 的值就是矩陣 h 的一直行的內容。

程式流程控制之範例四 若要跳出 for 迴圈,可用 break 指令。例如,若要找出最小的 n 值,滿足 n! > 10100,可輸入如下: 範例16-4 : break01.m for i = 1:1000 if prod(1:i) > 1e100 fprintf('%g! = %e > 1e100\n', i, prod(1:i)); break; % 跳出 for 迴圈 end 70! = 1.197857e+100 > 1e100

程式流程控制之範例五 在一個迴圈內若要直接跳至到此迴圈下一回合的執行,可使用 continue 指令。 範例16-5 : continue01.m x = [1 -2 3 -4 5]; posTotal = 0; for i = 1:length(x) if x(i)<0, continue; end % 若 x(i) 小於零,跳到此迴圈的下一回合 posTotal=posTotal+x(i); end posTotal % 顯示 posTotal 的值 posTotal = 9 上述範例中,我們計算向量 x 的正元素的總和,因此只要遇到 x(i) 是負數,即可使用 continue 指令來直接跳到此迴圈的下一個回合來繼續執行。Continue 指令從MATLAB 6.x 才開始支援,若是使用 MATLAB 5.x,可用 if–then–else 來達到相同的功能。

程式流程控制之範例六 先前產生調和數列的例子,亦可用 while 迴圈改寫如下: 範例16-6 : while01.m x = zeros(1,6); i = 1; while i<=6 x(i) = 1/i; i = i+1; end x % 顯示 x x = 1.0000 0.5000 0.3333 0.2500 0.2000 0.1667

程式流程控制之範例七 若要用 while 指令找出最小的 n 值,使得 n! > 10100 ,可輸入如下: 範例16-7 : while02.m n = 1; while prod(1:n) < 1e100 n = n+1 end fprintf('%g! = %e > 1e100\n', n, prod(1:n)); 70! = 1.197857e+100 > 1e100 與前述的 for 迴圈相同,在任何時刻若要跳出 while 迴圈,亦可使用 break 指令;若要跳到下一回合的 while 迴圈,也可以使用 continue 指令。 無論是 for 或 while 迴圈,均會降低 MATLAB 的執行速度,因此盡量使用向量化的運算(Vectorized Operations)而盡量少用迴圈。 break 指令若用在多重迴圈中,每次只跳出包含break指令的最內部迴圈。

16-2 條件指令 MATLAB 支援二種條件指令(Branching Command,或中譯成「分支指令」),一種是 if-then-else 條件指令,另一種是 MATLAB 在第五版之後開始支援的 switch - case - otherwise 條件指令,以下分述之。 最常用的條件指令是 if - then - else,其使用語法為: if 條件式 運算式一; else 運算式二; end 當條件式成立時,MATLAB 將執行運算式一,否則,就執行運算式二。若不需使用運算式二,則可直接省略 else 和運算式二。

程式流程控制之範例八 在數值運算的過程中,若變數值為 NaN(即 Not A Number )時,我們要立刻印出警告訊息,可輸入如下例: 範例16-8 : if01.m x = 0/0; if isnan(x) disp('Warning: NaN detected!'); end Warning: Divide by zero. … Warning: NaN detected! 在上例中,第一個警告訊息是 MATLAB 自動產生的,第二個警告訊息則是我們的程式碼產生的,其中 isnan(x) 可用於判斷 x 是否為 NaN,若是,則傳回 1(真),否則即傳回 0(偽)。

程式流程控制之範例九 在下例中,我們可根據向量 y 的元素值為奇數或偶數,來顯示不同的訊息: 範例16-9 : if02.m for i = 1:length(y) if rem(y(i), 2)==0 fprintf('y(%g) = %g is even.\n', i, y(i)); else 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. 上述的 if - then - else 為雙向條件,亦即程式只會執行「運算式一」或「運算式 二」,不會有第三種可能。

程式流程控制之範例十 MATLAB 亦可執行多向條件,若要進行更多向的條件,只需一再重覆 elseif 即可。例如,欲判斷 y 向量之元素是屬於 3n、3n+1、 或 3n+2,可輸入如下: 範例16-10 : if03.m 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)); else 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.

switch-case-otherwise 指令 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) end 在上述語法中,expression 為一數值或字串,當其值和 value(k) 相等時,MATLAB 即執行 statement(k) 並跳出 switch 指令。若 expression 不等於 value(k),k=1, 2, …, n-1,則 MATLAB 會執行 statement(n) 並跳出 switch 指令。

程式流程控制之範例十一 欲根據月份來判斷其季別,可輸入如下: 範例16-11 : switch01.m 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'; end fprintf('Month %d ===> %s.\n', month, season); Month 1 ===> Winter. . . . . Month 12 ===> Winter.

程式流程控制之範例十二 如果 expression 是字串,那麼若要在 case 之後比對多個字串,就必需使用字串的異值陣列(Cell Arrey of Strings): 範例16-12 : switch02.m month = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep'}; 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'; end fprintf('%s is %s.\n', month{i}, season);

程式流程控制之範例十二 上述範例output如下: 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. MATLAB 的 switch 指令和 C 語言的 switch 指令略有差別:在 C 語言的 switch 敘述內,每個 case 敘述需加上 break 以跳出該 switch 敘述,而在 MATLAB 則不必多此一舉。 一般而言,switch–case–otherwise 的執行效率優於 if–then–else 。