12.07.2015 Views

Matlab/Octave Tutorial

Matlab/Octave Tutorial

Matlab/Octave Tutorial

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Outline• Basics of <strong>Matlab</strong> (slides from 張 智 星 教 授 )• 初 探 MATLAB• 二 維 平 面 繪 圖• 矩 陣 的 處 理 與 運 算• M 檔 案• Symbolic Toolbox in <strong>Matlab</strong> (slides from Prof.Paul Söderlind)3


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB2-1 使 用 變 數 與 基 本 運 算• 一 般 數 學 符 號 運 算• 在 MATLAB 命 令 視 窗 (Command Window) 內 的提 示 符 號 (>>) 之 後 輸 入 運 算 式 , 並 按 入 Enter鍵 即 可 。 例 如 :>> (5*2+3.5)/5ans =2.7000• 若 不 想 讓 MATLAB 每 次 都 顯 示 運 算 結 果 , 只 需 在運 算 式 最 後 加 上 分 號 (;) 即 可 , 例 如 :>> (5*2+3.5)/5;5


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB變 數 命 名 規 則 與 使 用• 第 一 個 字 母 必 需 是 英 文 字 母 。• 字 母 間 不 可 留 空 格 。• 最 多 只 能 有 31 個 字 母 ,MATLAB 會 忽 略 多 餘字 母 ( 在 MATLAB 第 4 版 , 則 是 19 個 字母 )。• MATLAB 在 使 用 變 數 時 , 不 需 預 先 經 過 變 數宣 告 (Variable Declaration) 的 程 序 , 而 且所 有 數 值 變 數 均 以 預 設 的 double 資 料 型 式 儲存 。6


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB加 入 註 解• 若 要 加 入 註 解 (Comments), 可 以 使 用 百 分比 符 號 (%) 例 如 :>> y = (5*2+3.5)/5; % 將 運 算 結 果 儲 存 在 變 數 y, 但 不 用 顯 示 於 螢 幕>> z = y^2 % 將 運 算 結 果 儲 存 在 變 數 z, 並 顯 示 於 螢 幕z =7.29007


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB2-2 向 量 與 矩 陣 的 處 理• MATLAB 中 的 變 數 還 可 用 來 儲 存 向 量(Vectors) 及 矩 陣 (Matrix), 以 進 行 各 種運 算 , 例 如 :>> s = [1 3 5 2];% 注 意 [] 的 使 用 , 及 各 數 字 間 的 空 白 間 隔>> t = 2*s+1t =3 7 11 58


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB矩 陣 的 各 種 處 理• MATLAB 亦 可 取 出 向 量 中 的 一 個 元 素 或 一 部 份 來 做運 算 , 例 如 :>> t(3) = 2 % 將 向 量 t 的 第 三 個 元 素 更 改 為 2t =3 7 2 5>> t(6) = 10% 在 向 量 t 加 入 第 六 個 元 素 , 其 值 為 10t =3 7 2 5 0 10>> t(4) = [] % 將 向 量 t 的 第 四 個 元 素 刪 除 ,[] 代 表 空 集 合t =3 7 2 0 109


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB建 立 大 小 為 m×n 的 矩 陣• 在 每 一 橫 列 結 尾 加 上 分 號 (;), 例 如 :>> A = [1 2 3 4; 5 6 7 8; 9 10 11 12]; % 建 立 3×4 的 矩 陣 A>> A % 顯 示 矩 陣 A 的 內 容A =1 2 3 45 6 7 89 10 11 1210


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABmxn 矩 陣 的 各 種 處 理 之 一• >> A(2,3) = 5 % 將 矩 陣 A 第 二 列 、 第 三 行 的 元 素 值 , 改 變 為 5A =1 2 3 45 6 5 89 10 11 12• >> B = A(2,1:3) % 取 出 矩 陣 A 的 第 二 橫 列 、 第 一 至 第 三 直 行 , 並 儲 存成 矩 陣 BB =5 6 511


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABmxn 矩 陣 的 各 種 處 理 之 二• >> A = [A B'] % 將 矩 陣 B 轉 置 後 、 再 以 行 向 量 併 入 矩 陣 AA =1 2 3 4 55 6 5 8 69 10 11 12 5• >> A(:, 2) = [] % 刪 除 矩 陣 A 第 二 行 (: 代 表 所 有 橫 列 ,[] 代 表 空 矩陣 )A =1 3 4 55 5 8 69 11 12 512


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABmxn 矩 陣 的 各 種 處 理 之 三• >> A = [A; 4 3 2 1] % 在 原 矩 陣 A 中 , 加 入 第 四 列A =1 3 4 55 5 8 69 11 12 54 3 2 1• >> A([1 4], :) = [] % 刪 除 第 一 、 四 列 (: 代 表 所 有 直 行 ,[] 是 空 矩陣 )A =5 5 8 613


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB2-3 常 用 數 學 函 數• MATLAB 是 一 個 科 學 計 算 軟 體 , 因 此 可 以 支援 很 多 常 用 到 的 數 學 函 數• >> y = abs(x) % 取 x 的 絕 對 值• >> y = sin(x) % 取 x 的 正 弦 值• >> y = exp(x) % 自 然 指 數 exp(x)• >> y = log(x) % 自 然 對 數 ln(x)• MATLAB 也 支 援 複 數 運 算 , 通 常 以 i 或 j 代 表單 位 虛 數14


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB向 量 矩 陣 的 運 算• 有 一 些 函 數 是 特 別 針 對 向 量 而 設 計• >> y = min(x) % 向 量 x 的 極 小 值• >> y = max(x) % 向 量 x 的 極 大 值• >> y = mean(x) % 向 量 x 的 平 均 值• >> y = sum(x) % 向 量 x 的 總 和• >> y = sort(x) % 向 量 x 的 排 序15


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB線 上 支 援• help: 用 來 查 詢 已 知 指 令 的 用 法 。• lookfor: 用 來 尋 找 未 知 的 指 令 。 找 到 所 需 的指 令 後 , 即 可 用 help 進 一 步 找 出 其 用 法 。• helpwin 或 helpdesk: 產 生 線 上 支 援 視 窗 ,其 效 果 和 直 接 點 選 MATLAB 命 令 視 窗 工 作 列的 圖 示 是 一 樣 的 。• doc: 產 生 特 定 函 數 的 線 上 支 援 。16


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB2-4 程 式 流 程 控 制• MATLAB 提 供 重 複 迴 圈 (Loops) 及 條 件 判 斷(Conditions) 等 程 式 流 程 控 制 (FlowControl) 的 指 令• for 迴 圈For 變 數 = 向 量運 算 式 ;end17


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB流 程 控 制• while 迴 圈 (While-loop)while運 算 式 ;end條 件 式• if – else –endif 條 件 式運 算 式 ;else運 算 式 ;end18


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB2-5 M 檔 案• 若 要 一 次 執 行 大 量 的 MATLAB 指 令 , 可 將 這些 指 令 存 放 於 一 個 副 檔 名 為 m 的 檔 案 , 並 在MATLAB 指 令 提 示 號 下 鍵 入 此 檔 案 的 主 檔 名即 可 。>> pwd % 顯 示 目 前 的 工 作 目 錄>> cd d:\matlabBook\MATLAB 程 式 設 計 : 入 門 篇 \02- 初 探 MATLAB>> type myTest.m % 顯 示 myTest.m 的 內 容>> myTest % 執 行 myTest.m19


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB2-6 搜 尋 路 徑• 若 要 檢 視 MATLAB 已 設 定 的 搜 尋 路 徑 , 鍵 入 path指 令 即 可 :>> path• 若 只 要 查 詢 某 一 特 定 指 令 所 在 的 搜 尋 路 徑 , 可 用which 指 令• 要 將 目 錄 加 入 MATLAB 的 搜 尋 路 徑 , 可 使 用addpath 指 令20


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB2-7 工 作 空 間 與 變 數 的 儲 存 及 載 入• MATLAB 在 進 行 各 種 運 算 時 , 會 將 變 數 儲 存在 記 憶 體 內 , 這 些 儲 存 變 數 的 記 憶 體 空 間 稱為 基 本 工 作 空 間 (Base Workspace) 或 簡 稱工 作 空 間 (Workspace)• 若 要 檢 視 現 存 於 工 作 空 間 (Workspace) 的 變數 , 可 鍵 入 who• 若 要 知 道 這 些 變 數 更 詳 細 的 資 料 , 可 使 用 whos指 令21


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB檢 視 工 作 空 間 變 數 的 其 他 方 式• 使 用 clear 指 令 來 清 除 或 刪 除 工 作 空 間 內 的 某 一 特定 或 所 有 變 數 , 以 避 免 記 憶 體 的 閒 置 與 浪 費• 不 加 任 何 選 項 (Options) 時 ,save 指 令 會 將 工 作空 間 內 的 變 數 以 二 進 制 (Binary) 的 方 式 儲 存 至 副檔 名 為 mat 的 檔 案• save: 將 工 作 空 間 的 所 有 變 數 儲 存 到 名 為 matlab.mat 的二 進 制 檔 案 。• save filename: 將 工 作 空 間 所 有 變 數 儲 存 到 名 為filename.mat 的 二 進 制 檔 案 。• save filename x y z: 將 變 數 x、y、z 儲 存 到 名 為filename.mat 的 二 進 制 檔 案 。22


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB2-8 離 開 MATLAB• 在 命 令 視 窗 內 , 鍵 入 exit 指 令 。• 在 命 令 視 窗 內 , 鍵 入 quit 指 令 。• 直 接 關 閉 MATLAB 的 命 令 視 窗 。23


MATLAB 程 式 設 計 入 門 篇二 維 平 面 繪 圖張 智 星jang@cs.nthu.edu.twhttp://www.cs.nthu.edu.tw/~jang清 大 資 工 系 多 媒 體 檢 索 實 驗 室


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB3-1 基 本 的 繪 圖 指 令• Plot : 最 基 本 的 繪 圖 指 令• 對 x 座 標 及 相 對 應 的 y 座 標 進 行 作 圖• 範 例 3-1:plotxy01.mx = linspace(0, 2*pi);y = sin(x);plot(x, y);% 在 0 到 2π 間 , 等 分 取 100 個 點% 計 算 x 的 正 弦 函 數 值% 進 行 二 維 平 面 描 點 作 圖25


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -110.80.60.40.20-0.2-0.4-0.6-0.8-10 1 2 3 4 5 6 7• linspace(0, 2*pi) 產 生 從0 到 2π 且 長 度 為 100( 預 設 值 ) 的 向 量 x• y 是 對 應 的 y 座 標• 只 給 定 一 個 向 量• 該 向 量 則 對 其 索 引 值(Index) 作 圖• plot(y) 和 plot(1:length(y), y)會 得 到 相 同 的 結 果26


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -2 (I)• 一 次 畫 出 多 條 曲 線• 將 x 及 y 座 標 依 次 送 入 plot 指 令• 範 例 3-2:plotxy02.mx = linspace(0, 2*pi);% 在 0 到 2 間 , 等 分 取 100 個 點plot(x, sin(x), x, cos(x), x, sin(x)+cos(x)); % 進 行 多 條 曲 線 描 點 作 圖27


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -2 (II)Plot(x,sin(x), x, cos(x), x, sin(x)+cos(x));1.51• 畫 出 多 條 曲線 時 , 會 自 動輪 換 曲 線 顏 色0.50-0.5-1-1.50 1 2 3 4 5 6 728


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -3 (I)• 若 要 以 不 同 的 線 標 (Marker) 來 作 圖• 範 例 3-3:plotxy03.mx = linspace(0, 2*pi);% 在 0 到 2 間 , 等 分 取 100 個 點plot(x, sin(x), 'o', x, cos(x), 'x', x, sin(x)+cos(x), '*');29


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -3 (II)1.510.50-0.5-1-1.50 1 2 3 4 5 6 730


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -4 (II)1086420-2-4-6-80 5 10 15 20 25 30 35 40 45 50• peaks 指 令 產 生 一 個 49×49 的 矩 陣 , 代 表 二 維 函 數 的 值• plot(y) 直 接 畫 出 49 條 直 線• 類 似 於 從 側 面 觀 看 peaks 函 數32


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -5 (I)• x 和 y 都 是 矩 陣• plot(x, y) 會 取 用 y 的 每 一 個 行 向 量 和 對 應 的x 行 向 量 作 圖• 範 例 3-5:plotxy05.mx = peaks;y = x';plot(x, y);% 求 矩 陣 x 的 轉 置 矩 陣 x'% 取 用 矩 陣 y 的 每 一 行 向 量 , 與 對 應 矩 陣 x% 的 每 一 個 行 向 量 作 圖33


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -5 (II)1086420-2-4-6-8-8 -6 -4 -2 0 2 4 6 8 1034


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB提 示• 一 般 情 況 下 ,MATLAB 將 矩 陣 視 為 行 向 量 的 集合• 對 只 能 處 理 向 量 的 函 數 (Ex : max、min、mean)• 給 定 一 個 矩 陣 , 函 數 會 對 矩 陣 的 行 向 量 一 一 進 行處 理 或 運 算35


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -6 (I)• z 是 一 個 複 數 向 量 或 矩 陣• plot(z) 將 z 的 實 部 ( 即 real(z)) 和 虛 部 ( 即 imag(z))當 成 x 座 標 和 y 座 標 來 作 圖 ,• 其 效 果 等 於 plot(real(z), imag(z))• 範 例 3-6:plotxy06.mx = randn(30);% 產 生 30×30 的 亂 數 ( 正 規 分 佈 ) 矩 陣z = eig(x); % 計 算 x 的 「 固 有 值 」( 或 稱 「 特 徵 值 」)plot(z, 'o')grid on% 畫 出 格 線36


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -6 (II)• x 是 一 個 30×30 的 亂 數 矩 陣543210-1-2-3-4-5-8 -6 -4 -2 0 2 4 6• z 則 是 x 的 「 固 有 值 」(Eigenvalue, 或 「 特 徵 值 」)• z 是 複 數 向 量 , 且 每 一 個 複 數 都 和 其 共 軛 複 數 同 時 出 現 , 因 此 畫 出 的圖 是 上 下 對 稱37


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB基 本 二 維 繪 圖 指 令指 令Plotloglogsemilogxsemilogyplotyy說 明x 軸 和 y 軸 均 為 線 性 刻 度 (Linear Scale)x 軸 和 y 軸 均 為 對 數 刻 度 (Logarithmic Scale)x 軸 為 對 數 刻 度 ,y 軸 為 線 性 刻 度x 軸 為 線 性 刻 度 ,y 軸 為 對 數 刻 度畫 出 兩 個 刻 度 不 同 的 y 軸38


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -7 (I)• Semilogx 指 令• 使 x 軸 為 對 數 刻 度 , 對 正 弦 函 數 作 圖• 範 例 plotxy07.mx = linspace(0, 8*pi);semilogx(x, sin(x));% 在 0 到 8 間 , 等 分 取 100 個 點% 使 x 軸 為 對 數 刻 度 , 並 對 其 正 弦 函 數 作 圖39


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -7 (II)10.80.60.40.20-0.2-0.4-0.6-0.8-110 -1 10 0 10 1 10 2X 軸 為 對 數 刻 度40


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -8 (I)• plotyy 指 令• 畫 出 兩 個 刻 度 不 同 的 y 軸• 範 例 3-8:plotxy08.mx = linspace(0, 2*pi);% 在 0 到 2 間 , 等 分 取 100 個 點y1 = sin(x);y2 = exp(-x);plotyy(x, y1, x, y2);% 畫 出 兩 個 刻 度 不 同 的 y 軸 , 分 別 是 y1, y241


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABPlot 基 本 繪 圖 -8 (II)11Y1 的 刻 度-1• y1 的 刻 度 是 在 左 手 邊• y2 的 刻 度 是 在 右 手 邊• 兩 邊 的 刻 度 不 同00.50 1 2 3 4 5 6 7 0Y2 的 刻 度42


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB3-2 圖 形 的 控 制• plot 指 令 , 可 以 接 受 一 個 控 制 字 串 輸 入• 用 以 控 制 曲 線 的 顏 色 、 格 式 及 線 標• 使 用 語 法plot(x, y, ‘CLM‘)• C: 曲 線 的 顏 色 (Colors)• L: 曲 線 的 格 式 (Line Styles)• M: 曲 線 所 用 的 線 標 (Markers)43


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 形 控 制 範 例 -1 (I)• 用 黑 色 點 線 畫 出 正 弦 波• 每 一 資 料 點 畫 上 一 個 小 菱 形• 範 例 3-9:plotxy09.mx = 0:0.5:4*pi; % x 向 量 的 起 始 與 結 束 元 素 為 0 及 4,% 0.5 為 各 元 素 相 差 值y = sin(x);plot(x, y,‘k:diamond’)% 其 中 「k」 代 表 黑 色 ,「:」 代 表 點% 線 , 而 「diamond 」 則 指 定 菱 形 為 曲% 線 的 線 標44


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 形 控 制 範 例 -1 (II)10.80.60.40.20-0.2-0.4-0.6-0.8-10 2 4 6 8 10 12 1445


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABplot 指 令 的 曲 線 顏 色Plot 指 令 的 曲 線 顏 色 字 串bcgkmrwy曲 線 顏 色藍 色 (Blue)青 藍 色 (Cyan)綠 色 (Green)黑 色 (Black)紫 黑 色 (Magenta)紅 色 (Red)白 色黃 色 (Yellow)RGB 值(0,0,1)(0,1,1)(0,1,0)(0,0,0)(1,0,1)(1,0,0)(1,1,1)(1,1,0)46


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABplot 指 令 的 曲 線 格 式plot 指 令 的 曲 線 格 式 字 串---:-.曲 線 格 式實 線 ( 預 設 值 )虛 線點 線點 虛 線47


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABplot 指 令 的 曲 線 線 標 (I)plot 指 令 的 曲 線 線 標 字 串O+X*.^V曲 線 符 號 符 號圓 形加 號叉 號星 號點 號朝 上 三 角 形朝 下 三 角 形48


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABplot 指 令 的 曲 線 線 標 (II)plot 指 令 的 曲 線 線 標 字 串>


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB3-3 圖 軸 的 控 制• plot 指 令 會 根 據 座 標 點 自 動 決 定 圖 軸 範 圍• 也 可 以 使 用 axis 指 令 指 定 圖 軸 範 圍• 使 用 語 法 :axis([xmin, xmax, ymin, ymax])• xmin , xmax: 指 定 x 軸 的 最 小 和 最 大 值• ymin , ymax: 指 定 y 軸 的 最 小 和 最 大 值50


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -1 (I)• 畫 出 正 弦 波 在 y 軸 介 於 0 和 1 的 部 份• 範 例 3-10:plotxy10.mx = 0:0.1:4*pi;% 起 始 與 結 束 元 素 為 0 及 4,0.1 為 各% 元 素 相 差 值y = sin(x);plot(x, y);axis([-inf, inf, 0, 1]);% 畫 出 正 弦 波 y 軸 介 於 0 和 1 的 部 份51


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -1 (II)• inf 指 令 :10.90.80.70.60.50.40.30.20.100 2 4 6 8 10 12• 以 資 料 點 ( 上 例 : x 軸 的 資 料 點 ) 的 最 小 和 最 大 值 取 代 之52


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -2 (I)• 指 定 圖 軸 上 的 格 線 點 (Ticks)• 範 例 3-11:plotxy11.mx = 0:0.1:4*pi;plot(x, sin(x)+sin(3*x))set(gca, ‘ytick’, [-1 -0.3 0.1 1]);grid on% 在 y 軸 加 上 格 線 點% 加 上 格 線53


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -2 (II)格 使線 用點 者和 加文 入字 的10.1-0.3-1• grid on: 加 上 格 線• gca:• get current axis 的 簡 稱• 傳 回 目 前 使 用 中 的 圖 軸0 2 4 6 8 10 12 14• gca 屬 Handle Graphics 的 指 令 , 第 七 章 會 有 更 詳 細 的 說 明54


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -3 (I)• 將 格 線 點 的 數 字 改 為 文 字• 範 例 3-12:plotxy12.mx = 0:0.1:4*pi;plot(x, sin(x)+sin(3*x))set(gca, 'ytick', [-1 -0.3 0.1 1]);% 改 變 格 線 點set(gca, ‘yticklabel’, {‘ 極 小 ’,‘ 臨 界 值 ’,‘ 崩 潰 值 ’,‘ 極 大 ’});% 改 變 格 線 點 的 文 字grid on% 加 上 格 線55


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -3 (II)56


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABSubplot• subplot• 在 一 個 視 窗 產 生 多 個 圖 形 ( 圖 軸 )• 一 般 形 式 為 subplot (m, n, p)• 將 視 窗 分 為 m ×n 個 區 域• 下 一 個 plot 指 令 繪 圖 於 第 p 個 區 域• p 的 算 法 為 由 左 至 右 , 一 列 一 列57


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -4 (I)• 同 時 畫 出 四 個 圖 於 一 個 視 窗 中• 範 例 3-13:plotxy13.mx = 0:0.1:4*pi;subplot(2, 2, 1); plot(x, sin(x));subplot(2, 2, 2); plot(x, cos(x));subplot(2, 2, 3); plot(x, sin(x).*exp(-x/5));subplot(2, 2, 4); plot(x, x.^2);% 此 為 左 上 角 圖 形% 此 為 右 上 角 圖 形% 此 為 左 下 角 圖 形% 此 為 右 下 角 圖 形58


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -4 (II)110.50.5Subplot(2,2,1)00Subplot(2,2,2)-0.5-0.5-10 5 10 15-10 5 10 1512000.5150Subplot(2,2,3)010050Subplot(2,2,4)-0.50 5 10 1500 5 10 1559


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -5 (I)• 長 寬 比 (Aspect Ratio)• 一 般 圖 軸 長 寬 比 是 視 窗 的 長 寬 比• 可 在 axis 指 令 後 加 不 同 的 字 串 來 修 改• 範 例 3-14:plotxy14.mt = 0:0.1:2*pi;x = 3*cos(t);y = sin(t);subplot(2, 2, 1); plot(x, y); axis normalsubplot(2, 2, 2); plot(x, y); axis squaresubplot(2, 2, 3); plot(x, y); axis equalsubplot(2, 2, 4); plot(x, y); axis equal tight60


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB圖 軸 控 制 範 例 -5 (II)110.50.5axis normal0-0.50-0.5axis square-1-4 -2 0 2 4-1-5 0 52axis equal10-1-2-2 -1 0 1 2 30.50-0.5-2 -1 0 1 2 3axis square tight61


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB改 變 圖 軸 長 寬 比 的 指 令• 改 變 目 前 圖 軸 長 寬 比 的 指 令• 需 在 plot 指 令 之 後 呼 叫 才 能 發 揮 效 用指 令axis normalaxis squareaxis equalaxis equal tightaxis image說 明使 用 預 設 長 寬 比 ( 等 於 圖 形 長 寬 比 )長 寬 比 例 為 1長 寬 比 例 不 變 , 但 兩 軸 刻 度 一 致兩 軸 刻 度 比 例 一 致 , 且 圖 軸 貼 緊 圖 形兩 軸 刻 度 比 例 一 致 ( 適 用 於 影 像 顯 示 )62


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB改 變 圖 軸 背 景 顏 色 的 指 令• colordef• 改 變 圖 軸 與 視 窗 之 背 景 顏 色• 先 呼 叫 colordef 指 令 , 其 後 plot 指 令 產 生 的 圖 形才 有 效 用指 令colordef whitecolordef blackcolordef none說 明圖 軸 背 景 為 白 色 , 視 窗 背 景 為 淺 灰 色圖 軸 背 景 為 黑 色 , 視 窗 背 景 為 暗 灰 色圖 軸 背 景 為 黑 色 , 視 窗 背 景 為 黑 色 ( 這 是MATLAB 第 4 版 的 預 設 值 )63


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABgrid 和 box 指 令• 畫 出 格 線 或 畫 出 圖 軸 外 圍 的 方 形指 令grid ongrid offbox onbox off說 明畫 出 格 線取 消 格 線畫 出 圖 軸 的 外 圍 長 方 形取 消 圖 軸 的 外 圍 長 方 形64


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB3-4 加 入 說 明 文 字• 在 圖 形 或 圖 軸 加 入 說 明 文 字 , 增 進 整 體 圖 形的 可 讀 性指 令titlexlabelylabelzlabellegendtextgtext說 明圖 形 的 標 題x 軸 的 說 明y 軸 的 說 明z 軸 的 說 明 ( 適 用 於 立 體 繪 圖 )多 條 曲 線 的 說 明在 圖 形 中 加 入 文 字使 用 滑 鼠 決 定 文 字 的 位 置65


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB說 明 文 字 範 例 -1 (I)• 範 例 3-15:plotxy15.msubplot(1,1,1);x = 0:0.1:2*pi;y1 = sin(x);y2 = exp(-x);plot(x, y1, '--*', x, y2, ':o');xlabel('t = 0 to 2\pi');ylabel('values of sin(t) and e^{-x}')title('Function Plots of sin(t) and e^{-x}');legend('sin(t)','e^{-x}');66


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB說 明 文 字 範 例 -1 (II)values of sin(t) and e -x10.80.60.40.20-0.2-0.4-0.6-0.8Function Plots of sin(t) and e -xsin(t)e -x-10 1 2 3 4 5 6 7t = 0 to 2• legend 指 令• 畫 出 一 小 方 塊 , 包 含 每條 曲 線 的 說 明• 「\」 為 特 殊 符 號• 產 生 上 標 、 下 標 、 希 臘字 母 、 數 學 符 號 等• 遵 循 一 般 LaTex 或 TeX數 學 模 式67


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB說 明 文 字 範 例 -2 (I)• text 指 令• 使 用 語 法 :text(x, y, string)• x、y : 文 字 的 起 始 座 標 位 置• string : 代 表 此 文 字• 範 例 3-16:plotxy16.mx = 0:0.1:2*pi;plot(x, sin(x), x, cos(x));text(pi/4, sin(pi/4),'\leftarrow sin(\pi/4) = 0.707');text(5*pi/4, cos(5*pi/4),'cos(5\pi/4) = -0.707\rightarrow','HorizontalAlignment', 'right');68


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB說 明 文 字 範 例 -2 (II)10.80.60.40.2 sin(/4) = 0.707• 「HorizontalAlignment」及 「right」 指 示 text 指 令將 文 字 向 右 水 平 靠 齊0-0.2-0.4-0.6-0.8cos(5/4) = -0.707-10 1 2 3 4 5 6 769


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABgtext 指 令• 使 用 語 法gtext(string)• 在 圖 上 點 選 一 位 置 後 ,string 顯 示 在 其 上 。• gtext 只 能 用 在 二 維 平 面 繪 圖70


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB• 各 種 二 維 繪 圖 指 令3-5 其 他 平 面 繪 圖 指 令指 令errorbarfplot、ezplotpolar、ezpolarhistrosecompassfeatherareastairs說 明在 曲 線 加 上 誤 差 範 圍較 精 確 的 函 數 圖 形極 座 標 圖 形直 角 座 標 質 方 圖 ( 累 計 圖 )極 座 標 質 方 圖 ( 累 計 圖 )羅 盤 圖羽 毛 圖面 積 圖 ( 第 五 章 「 特 殊 圖 形 」 介 紹 )階 梯 圖 ( 第 五 章 「 特 殊 圖 形 」 介 紹 )71


第 九 章 :矩 陣 的 處 理 與 運 算張 智 星jang@cs.nthu.edu.twhttp://www.cs.nthu.edu.tw/~jang清 大 資 工 系 多 媒 體 檢 索 實 驗 室


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB9-1 矩 陣 的 索 引 或 下 標• 矩 陣 A 中 , 位 於 第 i 橫 列 、 第 j 直 行 的 元 素 可 表示 為 A(i, j)i 與 j 即 是 此 元 素 的 下 標 (Subscript) 或 索 引 (Index)• MATLAB 中 , 所 有 矩 陣 的 內 部 表 示 法 都 是 以 直 行為 主 的 一 維 向 量A(i, j) 和 A(i+(j-1)*m) 是 完 全 一 樣 的 ~m 為 矩 陣 A 的 列 數• 我 們 可 以 使 用 一 維 或 二 維 下 標 來 存 取 矩 陣73


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB矩 陣 的 索 引 或 下 標74


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB矩 陣 的 索 引 或 下 標• 可 以 使 用 矩 陣 下 標 來 進 行 矩 陣 的 索 引 (Indexing)• A(4:5,2:3) - 取 出 矩 陣 A 的 第 四 、 五 橫 列 與 二 、 三 直 行 所 形 成 的部 份 矩 陣• A([9 14; 10 15]) - 用 一 維 下 標 的 方 式 來 達 到 同 樣 目 的• 用 冒 號 (:), 取 出 一 整 列 或 一 整 行• A(:, 5) - 取 出 矩 陣 A 的 第 五 個 直 行• 用 end 這 個 保 留 字 來 代 表 某 一 維 度 的 最 大 值• A(:, end) - 矩 陣 A 的 最 後 一 個 直 行• 可 以 直 接 刪 除 矩 陣 的 某 一 整 個 橫 列 或 直 行• A(2, :) = [] – 刪 除 A 矩 陣 的 第 二 列• A(:, [2 4 5]) = [] - 刪 除 A 矩 陣 的 第 二 、 四 、 五 直 行75


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB矩 陣 的 索 引 或 下 標• 可 依 次 把 矩 陣 A 和 其 倒 數 「 並 排 」 起 來 , 得 到 新 矩 陣 B• B = [A 1./A] - 1./A 是 矩 陣 A 每 個 元 素 的 倒 數• 用 diag 指 令 取 出 矩 陣 的 對 角 線 各 元 素• d = diag(B) - 取 出 矩 陣 B 的 對 角 線 元 素• 用 reshape 指 令 來 改 變 一 個 矩 陣 的 維 度• C = reshape(B, 2, 8) - 將 矩 陣 B 排 成 2×8 的 新 矩 陣 C• 注 意 !! MATLAB 會 先 將 矩 陣 B 排 成 一 個 行 向 量 ( 即 MATLAB內 部 的 矩 陣 表 示 法 ), 再 將 此 行 向 量 塞 成 2×8 的 新 矩 陣76


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB9-2 特 殊 用 途 矩 陣• 產 生 各 種 特 殊 用 途 矩 陣 的 好 用 指 令 :指 令zeros(m, n)ones(m, n)eye(n)pascal(m, n)vander(m, n)hilb(n)rand(m, n)randn(m, n)magic(n)說 明產 生 維 度 為 m×n , 構 成 元 素 全 為 0 的 矩 陣產 生 維 度 為 m×n , 構 成 元 素 全 為 1 的 矩 陣產 生 維 度 為 n×n , 對 角 線 的 各 元 素 全 為 1 , 其 他 各 元 素 全 為 0 的 單 位 矩 陣產 生 維 度 為 m×n 的 Pascal 矩 陣產 生 維 度 為 m×n 的 Vandermonde 矩 陣產 生 維 度 為 n×n 的 Hilbert 矩 陣產 生 [0, 1] 均 勻 分 佈 的 亂 數 矩 陣 , 其 維 度 為 m×n產 生 µ = 0, σ= 1 的 正 規 分 佈 亂 數 矩 陣 , 其 維 度 為 m×n產 生 維 度 為 n×n 的 魔 方 陣 , 其 各 個 直 行 、 橫 列 及 兩 對 角 線 的 元 素 和 都 相 等77


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB9-3 矩 陣 的 數 學 運 算• 矩 陣 的 加 減 與 一 般 純 量 (Scalar) 的 加 減 類 似• 相 加 或 相 減 的 矩 陣 必 需 具 有 相 同 的 維 度• 範 例 9-12: matrix12.mA = [12 34 56 20];B = [1 3 2 4];C = A + B13 37 58 24• 矩 陣 與 純 量 可 以 直 接 進 行 加 減 ,MATLAB 會直 接 將 加 減 應 用 到 每 一 個 元 素>> A = [1 2 3 2 1] + 5A =6 7 8 7 678


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB矩 陣 的 乘 法 與 除 法• 純 量 對 矩 陣 的 乘 或 除 , 可 比 照 一 般 寫 法>> A = [123 , 442]; >> C = A/3>> B = 2*A C =B = 41.0000 147.3333246 884• 欲 進 行 矩 陣 相 乘 , 必 需 確 認 第 一 個 矩 陣 的 直 行 數 目 ( ColumnDimension) 必 需 等 於 第 二 個 矩 陣 的 橫 列 數 目 (Row Dimension)• 範 例 9-13: matrix12.mA = [1; 2];B = [3, 4, 5];C = A*BC =3 4 56 8 10• 矩 陣 的 除 法 , 常 藉 由 反 矩 陣 或 解 線 性 方 程 式 來 達 成79


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB矩 陣 的 次 方 運 算• 矩 陣 的 次 方 運 算 , 可 由 「^」 來 達 成 , 但 矩 陣 必 需 是 方 陣 , 其 次 方 運 算才 有 意 義• 範 例 9-14: matrix14.mA = magic(3);B = A^2B =91 67 6767 91 6767 67 91• 在 「*」,「/」 及 「^」 之 前 加 上 一 個 句 點 ,MATLAB 將 會 執 行 矩 陣 內「 元 素 對 元 素 」(Element-by-element) 的 運 算A = [12; 45];B = [2; 3];C = A.*BD = A./BE = A.^2% 注 意 「*」 前 面 的 句 點% 注 意 「/」 前 面 的 句 點% 注 意 「^」 前 面 的 句 點80


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB轉 置 和 「 共 軛 轉 置 」 矩 陣• 複 數 矩 陣 z, 其 「 共 軛 轉 置 」 矩 陣 (Conjugate Transpose) 可 表 示 成矩 陣 z'• 範 例 9-16: conjTranspose01.mi = sqrt(-1);% 單 位 虛 數z = [1+i, 2; 3, 1+2i];w = z' % 共 軛 轉 置 ( 注 意 z 後 面 的 單 引 號 )w =1.0000-1.0000i 3.00002.0000 1.0000-2.0000i• 想 得 到 任 何 矩 陣 z 的 轉 置 (Transpose), 則 可 表 示 成 矩 陣 z. '• 範 例 9-17: transpose01.mi = sqrt(-1);% 單 位 虛 數z = [1+i, 2; 3, 1+2i];w = z.' % 單 純 轉 置 ( 注 意 z 後 面 的 句 點 及 單 引 號 )w =1.0000+1.0000i 3.00002.0000 1.0000+2.0000i• 若 z 為 實 數 , 則 z' 和 z.' 的 結 果 是 一 樣 的81


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB向 量 的 p-norm• 一 個 向 量 a 的 p-norm 可 以 定 義 為1/ ppa a , p 1piip=2 時 , 此 即 為 向 量 a 的 長 度 , 或 稱 歐 氏 長 度(Euclidean Length)• 欲 求 一 向 量 的 p-norm, 可 使 用 norm 指 令norm(x,p)• 範 例 9-18: normVector01.ma = [3 4];x = norm(a, 1) % x = 7y = norm(a, 2) % y = 5norm(a,1)norm(a,inf)z = norm(a, inf) % z = 4 i i82iaimaxa


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB矩 陣 的 p-norm• 一 個 矩 陣 A 的 p-norm 可 以 定 義 如 下 :ApmaxxAxxpp• norm 指 令 亦 可 用 於 計 算 矩 陣 的 p-norm• 範 例 9-19: normMatrix01.mA = [1 2 3; 4 5 6; 7 8 9];norm(A, 2) % ans = 16.8481• MATLAB 有 相 當 完 整 的 數 學 函 數 , 三 角 函 數 還 有 計 算向 量 元 素 統 計 量 的 函 數 ( 課 本 9-15~9-17)83


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABSort 指 令• sort 指 令 可 對 向 量 元 素 進 行 排 序 (Sorting)• 範 例 9-20: sort01.mx = [3 5 8 1 4];[sorted, index] = sort(x)sorted =1 3 4 5 8index =4 1 5 2 3% 對 矩 陣 x 的 元 素 進 行 排 序• sorted 是 排 序 後 的 向 量 ,index 則 是 每 個 排 序 後 的 元 素 在 原向 量 x 的 位 置• x(index) 即 等 於 sorted 向 量• 如 何 使 用 sort 指 令 加 上 前 例 中 的 sorted 及 index 來 求 得 原先 的 向 量 x?84


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB矩 陣 的 最 大 元 素• 找 出 一 矩 陣 最 大 元 素 的 位 置• 範 例 9-21: max01.mx = magic(5);[colMax, colMaxIndex] = max(x)colMax =23 24 25 21 22colMaxIndex =2 1 5 4 3• colMax 代 表 每 一 直 行 的 最 大 值 ,colMaxIndex 則 是 每 一 直 行 出 現 最 大 值 的 位 置• 求 得 x 的 最 大 元 素 的 位 置• 範 例 9-22: max02.mx = magic(5);[colMax, colMaxIndex] = max(x);[maxValue, maxIndex] = max(colMax);fprintf('Max value = x(%d, %d) = %d\n', colMaxIndex(maxIndex), maxIndex, maxValue);Max value = x(5, 3) = 25• x 的 最 大 元 素 即 是 maxValue, 發 生 位 置 為 [colMaxIndex(maxIndex), maxIndex] = [5 , 3]• 若 只 要 找 出 一 矩 陣 x 的 最 大 值 , 可 輸 入 max(max) 或 是 max(x(:))85


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB9-4 矩 陣 的 內 部 資 料 型 態• 一 般 矩 陣 的 內 部 資 料 型 態 都 是 double( 雙 精 準 浮 點 數 ),但 在 MATLAB 5.3 版 之 後 , 也 支 援 不 同 長 度 的 整 數 與 浮 點數 資 料 態指 令uint8uint16uint32int8int16int32singledoublechar說 明轉 換 成 帶 正 負 號 、 8 位 元 的 整 數 , 其 值 域 為 [-128,127]轉 換 成 帶 正 負 號 、16 位 元 的 整 數 , 其 值 域 為 [-32768,32767]轉 換 成 帶 正 負 號 、32 位 元 的 整 數 , 其 值 域 為 [-231,231-1]轉 換 成 不 帶 正 負 號 、 8 位 元 的 整 數 , 其 值 域 為 [0,255]轉 換 成 不 帶 正 負 號 、16 位 元 的 整 數 , 其 值 域 為 [0,65535]轉 換 成 不 帶 正 負 號 、32 位 元 的 整 數 , 其 值 域 為 [0,232-1]轉 換 成 single( 單 精 準 浮 點 數 ), 佔 用 32 位 元 (4 bytes)轉 換 成 double ( 雙 精 準 浮 點 數 ), 佔 用 64 位 元 (8 bytes)轉 換 成 字 元 或 字 串 , 每 個 字 元 佔 用 (16 位 元 )(2 bytes)86


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB不 同 資 料 的 儲 存• 我 們 要 節 省 記 憶 體 空 間 , 可 以 依 矩 陣 元 素 值 的 範 圍 , 選 用 不 同 的 資 料 來儲 存• 範 例 9-23: datatype01.mclear allx_double = magic(10);x_single = single(x_double);x32 = uint32(x_double);x16 = uint16(x_double);x8 = uint8(x_double);whos% 清 除 所 有 工 作 空 間 的 變 數Name Size Bytes Classx16 10x10 200 uint16 arrayx32 10x10 400 uint32 arrayx8 10x10 100 uint8 arrayx_double 10x10 800 double arrayx_single 10x10 400 single arrayGrand total is 500 elements using 1900 bytes• uint8 來 儲 存 變 數 所 佔 的 空 間 只 有 double 的 八 分 之 一 !87


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB資 料 儲 存 的 注 意 事 項• 整 數 資 料 型 態 的 範 圍 有 限 , 若 超 過 此 範 圍 , 則 超 出 部 分 將 會 被 「 裁 掉 」>> uint8(300) % uint8 的 最 大 值 為 255ans =255>> int8(-500) % int8 的 最 小 值 為 -128ans =-128• 整 數 資 料 型 態 可 以 比 較 大 小 , 但 不 可 直 接 進 行 數 學 運 算>> uint8(20)== 20 % 可 比 較 大 小ans =1>> uint8(20)-20 % 無 法 進 行 數 學 運 算??? Error using ==> -Function '-' not defined for variables of class 'uint8'.• 若 要 進 行 數 學 運 算 , 需 先 用 double 指 令 將 之 轉 成 雙 精 準 浮 點 數 才 能 進 行88


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


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB15-1 底 稿• 底 稿 (Script)• 副 檔 名 為 m 的 檔 案 , 包 含 MATLAB 各 種 指 令• 在 MATLAB 指 令 視 窗 直 接 輸 入 檔 名 , 即 逐 一 執 行檔 案 內 的 指 令90


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABM 檔 案 的 顯 示• 在 目 前 目 錄 下 有 一 個 M 檔 案 “script01.m”, 可 用type 指 令 顯 示 其 內 容 :>> cd ’d:\ matlabBook\MATLAB 程 式 設 計 : 入 門 篇 \15-M 檔 案 ’>> type script01.mclear all% 清 除 所 有 變 數x = [1 4 -2 3 -1 -5];for i = 1:length(x),if x(i)>0,fprintf('x(%g) = %g is positive\n', i, x(i));elsefprintf('x(%g) = %g is negative or zero\n', i, x(i));endend91


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABM 檔 案 的 執 行• 欲 執 行 script01.m,• 在 指 令 視 窗 下 輸 入 script01 即 可>> script01x(1) = 1 is positivex(2) = 4 is positivex(3) = -2 is negative or zerox(4) = 3 is positivex(5) = -1 is negative or zerox(6) = -5 is negative or zero92


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABM 檔 案 的 執 行 效 應• 執 行 程 式 底 稿 的 效 應 , 相 當 直 接 在 指 令 視 窗下 下 達 script01.m 裡 的 每 一 列 指 令• 所 產 生 的 變 數 也 都 存 放 在 MATLAB 的 基 本 工作 空 間 (Base Workspace), 可 驗 證 如 下 :>> whosName Size Bytes Classi 1x1 8 double arrayx 1x6 48 double arrayGrand total is 7 elements using 56 bytes93


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB提 示• 可 在 函 數 中 呼 叫 一 程 式 底 稿• 產 生 的 變 數 會 放 在 該 函 數 的 工 作 空 間 中94


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB• 優 點底 稿 的 優 缺 點• 適 用 於 簡 單 但 重 複 性 高 的 程 式 碼• 產 生 的 變 數 保 留 在 基 本 工 作 空 間 中• 變 數 檢 視 及 除 錯 容 易• 缺 點• 不 支 援 輸 入 及 輸 出 引 數 (Input/OutputArguments)• 產 生 的 變 數 保 留 在 基 本 工 作 空 間 中• 變 數 互 相 覆 蓋 而 造 成 程 式 錯 誤95


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABM 檔 案 編 輯 器 (I)• M 檔 案 是 文 字 檔• 可 以 用 各 種 文 字 編 輯 器 修 改• 儲 存 時 , 需 以 文 字 模 式 儲 存• MATLAB 在 Windows 及 Mac 平 台 上 , 提 供 了 內 建 的「M 檔 案 編 輯 器 」(M-File Editor)• 點 選 指 令 視 窗 的 file/open 下 拉 式 選 單 , 開 啟 M 檔 案 編 輯器• 或 在 指 令 視 窗 直 接 鍵 入 「edit filename.m」 或 「openfilename.m」96


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABM 檔 案 編 輯 器 (II)• 開 啟 Script01.m, 可 輸 入>> edit script01.m• 即 可 開 啟 M 檔 案 編 輯 器 :97


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB提 示• M 檔 案 編 輯 器 以 不 同 的 顏 色 顯 示 註 解 、 關 鍵字 、 字 串 、 及 一 般 程 式 碼• M 檔 案 編 輯 器 也 是 一 個 除 錯 器 (Debugger)• 欲 使 用 其 除 錯 功 能 , 詳 見 第 十 七 章 「 程 式 除 錯 」功 能 鍵 F12: 設 定 或 解 除 中 斷 點功 能 鍵 F5: 除 錯 模 式 下 執 行 程 式98


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB• 函 數• 也 是 M 檔 案 的 一 種15-2 函 數• 可 接 受 輸 入 變 數 , 並 將 結 果 送 至 輸 出 變 數• 運 算 過 程 產 生 的 變 數 都 存 放 在 函 數 本 身 的 工 作 空間• 不 會 和 MATLAB 基 本 工 作 空 間 的 變 數 相 互 覆 蓋• 函 數 適 用 於 大 型 程 式 碼• 使 程 式 碼 模 組 化 (Modularized) 並 易 於 維 護 與 改 進99


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB函 數 顯 示 及 內 容• func1.m 可 算 出 一 向 量 的 平 均 值• 用 type 指 令 顯 示 其 內 容 :>> type func1.mfunction average = func1(vector)average = sum(vector)/length(vector);% 計 算 平 均 值• 第 一 列 為 函 數 定 義 列 (Function Definition Line)• 定 義 函 數 名 稱 (func1, 最 好 和 檔 案 的 檔 名 相 同 )• 輸 入 引 數 (vector)• 輸 出 引 數 (average)• function 為 關 鍵 字• 第 二 列 為 函 數 主 體 (Function Body)• 規 範 函 數 運 算 過 程 , 並 指 定 輸 出 引 數 的 值100


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB呼 叫 函 數• 呼 叫 此 函 數 , 可 輸 入 :>> vec = [1 5 3];>> ave = func1(vec)ave =3101


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB函 數 線 上 輔 助 說 明 (I)• 加 上 函 數 「 線 上 輔 助 說 明 」(On-line Help)• 在 函 數 定 義 列 下 直 接 加 入 註 解>> type func2.mfunction average = func(vector)% FUNC2 A simple function with a single help line.%% Usage of this function:% output = func2(input)% "output" is the average of the input vector "input".% Roger Jang, 19991123.average = sum(vector)/length(vector);% 計 算 平 均 值102


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB函 數 線 上 輔 助 說 明 (II)• 函 數 定 義 列 之 後 的 連 續 註 解 ( 以 「%」 開頭 ), 即 為 函 數 的 線 上 輔 助 說 明• 輸 入 「help 函 數 主 檔 名 」, 即 可 看 到 這 些 輔助 說 明>> help func2FUNC2 A simple function with a single help line.Usage of this function:output = func2(input)"output" is the average of the input vector "input".103


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABH1 輔 助 說 明• 函 數 線 上 輔 助 說 明 , 最 重 要 的 就 是 第 一 列• 又 稱 為 「H1 輔 助 說 明 」(H1 Help)• 使 用 lookfor keyword 查 詢 MATLAB 指 令• 對 所 給 的 關 鍵 字 和 搜 尋 路 徑 上 所 有 函 數 的「H1 輔 助 說 明 」 一 一 比 對>> lookfor 'help line'FUNC2 A simple function with a single help line.104


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB提 示• 安 裝 很 多 工 具 箱 , 或 搜 尋 路 徑 很 長 時 ,lookfor 指 令 的 執 行 時 間 可 能 會 較 長105


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB函 數 的 目 錄 (I)• 使 MATLAB 在 任 何 目 錄 內 , 均 可 執 行 某 目 錄內 的 函 數• 將 和 某 應 用 相 關 的 函 數 , 存 放 於 一 子 目 錄 內• 將 此 目 錄 加 入 搜 尋 路 徑• 加 入 路 徑 => 使 用 addpath 指 令• 移 除 路 徑 => 使 用 rmpath 指 令106


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB函 數 的 目 錄 (II)• 建 立 目 錄 的 線 上 輔 助 說 明• 在 此 目 錄 下 加 入 特 定 檔 案 Contents.m• 此 檔 案 只 能 包 含 輔 助 說 明 文 字• 每 列 均 需 以 「%」 開 頭• 輸 入 「help 目 錄 名 稱 」 時 , 顯 示 在 「 目 錄 名 稱 」下 Contents.m 的 輔 助 說 明107


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB函 數 命 名 的 限 制• 函 數 名 稱 和 變 數 名 稱 有 相 同 的 限 制• 只 接 受 前 31 個 字 母 (MATLAB 5.x) 或 前 63 個字 母 (MATLAB 6.x 和 7.x)• 以 英 文 字 母 作 為 開 頭• 函 數 名 稱 和 檔 案 名 稱 不 同• 仍 可 依 檔 案 名 稱 呼 叫 檔 案• 函 數 名 稱 將 被 忽 略108


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB函 數 的 輸 入 和 輸 出• 一 個 函 數 可 以 有 多 輸 入 及 輸 出• func3.m 可 接 受 兩 個 輸 入 並 產 生 兩 個 輸 出>> type func3.mfunction [ave1, ave2] = func3(vector1, vector2);ave1 = sum(vector1)/length(vector1);ave2 = sum(vector2)/length(vector2);• func3.m 的 呼 叫 方 式>> [a, b] = func3([1 2 3], [4 5 6 7 8])a =2b =6109


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB輸 出 入 變 數 的 個 數 (I)• 決 定 函 數 實 際 輸 入 輸 出 變 數 的 個 數• 使 用 內 建 變 數 nargin 及 nargout• 主 要 功 能• 設 定 未 被 指 定 之 輸 入 引 數 的 預 設 值• 避 免 計 算 未 被 用 到 的 輸 出 引 數 , 以 節 省 計 算 時 間110


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB輸 出 入 變 數 的 個 數 (II)• 上 述 函 數 func3.m 可 改 寫 成 func4.m>> type func4.mfunction [ave1, ave2] = func4(vector1, vector2)if nargin == 1,% 只 有 一 個 輸 入 變 數ave1 = sum(vector1)/length(vector1);endif nargout == 2,% 有 兩 個 輸 出 變 數ave1 = sum(vector1)/length(vector1);ave2 = sum(vector2)/length(vector2);end111


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB輸 出 入 變 數 的 個 數 (III)• func4.m 可 以 接 受 一 個 或 兩 個 輸 入 變 數 :>> [a, b] = func4([1 2 3], [4 5 6 7 8])a = 2b = 6>> c = func4([1 3 5 7 9])c = 5• MATLAB 函 數 亦 可 傳 送 不 定 數 目 的 輸 入 引 數和 輸 出 引 數112


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB提 示• 從 外 表 來 看 ,MATLAB 函 數 的 變 數 傳 遞 方 法 是 “Callby Value”• 函 數 的 工 作 空 間 中 , 所 有 的 輸 入 變 數 均 是 父 工 作 空 間(Parent Workspace) 的 一 份 拷 貝• 在 函 數 中 更 改 這 些 輸 入 變 數 , 並 不 會 影 響 原 先 父 工 作 空 間的 變 數• 實 際 運 作 上• 若 輸 入 變 數 未 被 修 改 ,MATLAB 採 用 “Call by Reference”• 否 則 , 則 採 用 “Call by Value”113


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB15-3 次 函 數 與 私 有 化 目 錄• 一 個 M 檔 案 可 以 包 含 一 個 以 上 的 函 數• 一 個 主 函 數 (Primary Function)• 其 他 則 為 次 函 數 (Subfunctions)• 次 函 數 只 能 被 同 檔 案 中 的 函 數 ( 主 函 數 或 次 函 數 ) 呼 叫 ,但 不 可 被 不 同 檔 案 的 其 他 函 數 呼 叫• 主 函 數 與 次 函 數 的 位 置• 主 函 數 必 需 出 現 在 最 上 方• 其 後 接 上 任 意 數 目 的 次 函 數• 次 函 數 的 次 序 並 無 任 何 限 制114


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB主 函 數 與 次 函 數 範 例• func5.m 包 含 一 個 主 函 數 及 一 個 次 函 數• 次 函 數 的 功 能 是 計 算 倒 數 向 量>> type func5.mfunction out = func5(x)recip = reciproc(x);out = sum(recip);% Definition for subfunctionsfunction output = reciproc(input)output = 1./input;• 呼 叫 此 函 數>> func5([1 2 3])ans =1.8333115


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB私 有 化 目 錄• 私 有 化 目 錄 (Private Directory)• 在 目 錄 中 建 立 名 稱 為 private 的 私 有 化 目 錄• 存 放 與 這 目 錄 相 關 的 函 數• 目 錄 private 之 下 的 函 數 , 只 能 被 其 父 目 錄 函 數所 呼 叫 , 不 能 被 其 他 目 錄 的 函 數 來 呼 叫116


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB函 數 搜 尋 次 序• 從 M 檔 案 呼 叫 一 個 函 數 時 ,MATLAB 搜 尋 函數 的 次 序 :• 檢 查 此 函 數 是 否 為 次 函 數• 檢 查 此 函 數 是 否 為 私 有 化 目 錄 的 函 數• 從 系 統 所 設 定 的 搜 尋 路 徑 找 尋 此 函 數• MATLAB 找 到 第 一 個 檔 名 相 符 的 函 數 , 即 會立 即 取 用117


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB15-4 區 域 變 數 與 全 域 變 數• 區 域 變 數 (Local Variables)• 每 一 個 函 數 在 運 算 時 , 均 佔 用 個 別 的 記 憶 體• 此 工 作 空 間 和 MATLAB 的 基 本 工 作 空 間 或 是 其 他函 數 的 工 作 空 間 是 互 相 獨 立 的• 不 同 空 間 的 變 數 是 完 全 獨 立 , 不 會 相 互 影 響• 不 同 工 作 空 間 的 變 數 , 稱 為 「 區 域 變 數 」(LocalVariables)118


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB全 域 變 數 的 使 用 (I)• 減 少 變 數 的 傳 遞 , 可 用 「 全 域 變 數 」(GlobalVariables)• 使 用 全 域 變 數 前 , 需 先 進 行 變 數 宣 告>> type func6.mfunction func6global XX = X + 2;% 全 域 變 數 宣 告fprintf('The value of X in "func6" is %g.\n', X);119


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB全 域 變 數 的 使 用 (II)• Func6.m 沒 有 輸 出 和 輸 入 , 只 宣 告 全 域 變 數 X,將 X 的 值 加 2, 並 印 出 其 值• 測 試>> global X % 在 基 本 工 作 空 間 進 行 全 域 變 數 x 的 宣 告>> X = 2;>> fprintf('The value of X in the base workspace is %g.\n', X);The value of X in the base workspace is 2.>> func6;The value of X in "func6" is 4.>> fprintf('The value of X in the base workspace is %g.\n', X);The value of X in the base workspace is 4.120


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB全 域 變 數 的 使 用 原 則• 盡 量 少 用 全 域 變 數• 全 域 變 數 使 程 式 的 流 程 不 透 明 , 造 成 程 式 除 錯 或 維 護 的 困難• 使 用 全 域 變 數 , 請 遵 循 下 列 兩 原 則• 使 用 前 一 定 要 宣 告• 使 用 全 部 大 寫 或 較 長 的 變 數 名 稱 , 以 資 區 別• 檢 視 工 作 空 間 的 變 數 , 輸 入 whos global• 清 除 所 有 工 作 空 間 的 全 域 變 數 X, 需 使 用 clearglobal X121


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLAB15-5 程 式 碼 保 護 :p-code• p-code• 一 般 的 M 檔 案 都 是 文 字 檔• 所 有 的 MATLAB 原 始 程 式 碼 都 看 得 到• 讓 別 人 使 用 您 的 程 式 碼 , 又 不 想 被 看 到 程 式 碼 的內 容 , 使 用 pcode 指 令 將 底 稿 或 函 數 轉 成 p-code( 即 Pseudo-Code)pcode filename.m122


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABp-code 的 使 用• 將 函 數 func5.m 轉 成 p-code>> pcode func5.m>> dir *.pfunc5.p• 檢 視 func5, 以 p-code 的 程 式 碼 為 優 先>> which func5D:\matlabBook\MATLAB 程 式 設 計 : 入 門 篇 \15-M 檔 案 \func5.p• 呼 叫 p-code 的 函 數 和 一 般 函 數 並 無 不 同>> func5([2 4 8])ans =0.8750123


MATLAB 程 式 設 計 入 門 篇 : 初 探 MATLABp-code 提 高 效 率• 一 函 數 被 呼 叫 時 ,MATLAB 會 載 入 並 剖 析 (Parse)此 函 數• 剖 析 結 果 存 放 置 在 記 憶 體 內• 下 次 再 呼 叫 此 函 數 , 可 以 省 下 剖 析 所 花 的 時 間• pcode 的 作 用 是 將 程 式 碼 剖 析 後 的 結 果 儲 存• 程 式 碼 牽 涉 到 很 多 M 檔 案 時• 將 程 式 碼 轉 成 p-code, 節 省 剖 析 的 時 間124


The following slides are fromProf. Paul SöderlindUniversity of St. Gallen, Switzerlandhttp://home.tiscalinet.ch/paulsoderlind/


Lecture S1Symbolic Math Using MATLABPart 1: Algebra and calculusSee the demos in MATLAB's help, the MATLABSymbolic Toolbox instructions , andClarkson's on-line tutorial.Based on the Maple symbolic computational engine("kernel"), although with fewer commands andslightly more complex syntax.


Some contents of MATLAB's symbolic toolbox•Enter expressions in symbolic form•Expand or simplify expressions•Find symbolic roots, limits, minima, maxima•Differentiate and integrate•Generate Taylor series of functions•Solve equations symbolically•Solve simultaneous equations, even when nonlinear.•Variable precision arithmetic•Plotting and more127


Must first tell MATLAB that the variables to be used areto be symbolic rather than numeric (double) orcharacters. The easiest method is to use the symscommand (see >> help syms).>> syms x y a b c f g(Alternately, the sym command can be used, e.g.x=sym('x'), y=sym('y'), a=sym('a'), b=sym('b'), etc.)Notice how these variables are now designated in theWorkspace window (or >> whos), as “sym”rather than“double”or “char,”with values of .128


DifferentiationSee >>help sym/diffdfExample: find diff_f = , where f = e -ax x 3b sin(cx)dxwith a, b and c being unspecified constants:>> f=exp(-a*x)*x^(3*b)*sin(c*x), diff_f=diff(f,x)•You can use the simple (see >>help sym/simple)command to tell MATLAB to generate other forms ofthis expression. MATLAB selects the shortest form.>> simple(diff_f)•Do you agree with MATLAB’s choice (ans)?129


130


Multiple differentiationTo find diff2_f =d2dxf2we do >> diff2_f=diff(f,x,2)d gExercise: Determine the simplest form of2,dywhere2.113yg 2(sin y)(4y)2131


g=(1-3*y^2.1)/(sin(y)^2*(4+y))>> diff2_g=diff(g,y,2)diff2_g =-693/100*y^(1/10)/sin(y)^2/(4+y)+126/5*y^(11/10)/sin(y)^3/(4+y)*cos(y)+63/5*y^(11/10)/sin(y)^2/(4+y)^2+6*(1-3*y^(21/10))/sin(y)^4/(4+y)*cos(y)^2+4*(1-3*y^(21/10))/sin(y)^3/(4+y)^2*cos(y)+2*(1-3*y^(21/10))/sin(y)^2/(4+y)+2*(1-3*y^(21/10))/sin(y)^2/(4+y)^3Does simple simplify in this case?132


133


•Suppose you want the value of d 2 g/dy 2 for y =2.•What does the following give you?>> y = 2, diff2_g•So use subs command (see >>help sym/subs).>> diff2_g2=subs(diff2_g,2)•If you have more than one variable, you must use thefollowing syntax:subs(expression,{var1,var2 ...},{value 1, value 2, ..})•Exercise: find diff_f for x = 1, a = 2, b = 3, c = 4(remember f = e -ax x 3b sin(cx), diff_f=df/dx)134


•If you want diff_f to retain its original form:>> subs(diff_f,{x,a,b,c},{1,2,3,4})ans = -1.0708>> diff_fdiff_f = -exp(-a*x)*x^(3*b-1)*(a*sin(c*x)*x-3*b*sin(c*x)-cos(c*x)*c*x)•If you want diff_f to include these substitutions:>> diff_f=subs(diff_f,{x,a,b,c},{1,2,3,4}), diff_fdiff_f = -1.0708diff_f = -1.0708135


Indefinite IntegralsSee >> help sym/int•Find the indefinite integral int_g = gdx ,where g = e -ax sin(cx) .>> g = exp(-a*x)*sin(c*x), int_g=int(g,x)•Check by differentiating: >> diff(int_g,x)Does this return g?•>> simple(diff(int_g,x))•Repeat, adding a constant of integration A to theintegral.136


clear, syms a c x g A>> g = exp(-a*x)*sin(c*x), int_g=int(g,x)+Ag =exp(-a*x)*sin(c*x)int_g =-c/(a^2+c^2)*exp(-a*x)*cos(c*x)-a/(a^2+c^2)*exp(-a*x)*sin(c*x)+A>>gid=simple(diff(int_g,x))gid =exp(-a*x)*sin(c*x)137


Definite integralsSuppose we wantThe syntax is:gdxwith g defined as before.>> int_def_g=int(g,x,-pi,pi)int_def_g =-(c*cos(pi*c)+a*sin(pi*c)exp(pi*a)^2*c*cos(pi*c)+exp(pi*a)^2*a*sin(pi*c))/exp(pi*a)/(a^2+c^2)Now determine the numerical value of int_def_g fora=2 and c=4.138


• >> subs(int_def_g,{a,c},{2,4})ans =107.0980•Sometimes MATLAB is unable to find an analyticalsolution for a definite integral, e.g.:>> int(exp(sin(x)),x,0,1)•In such cases, the numerical procedure quad may beused, e.g.:>> quad('exp(sin(x))',0,1)•quad is not part of the symbolic toolbox139


LimitsThe symbolic toolbox also contains a command forfinding limits of expressions, e.g.:sin(ax)limitx0 x>> clear, syms x a, value=limit(sin(a*x)/x,x,0)There are cases where the limit depends on thedirection from which it is approached. Consider theplot of tan(x) versus x generated by>> ezplot('tan(x)')140


642tan(x)0-2-4-6-6 -4 -2 0 2 4 6xWhat is the value of tan(x) at x = /2? UsingMATLAB's numeric engine:>> tan(pi/2)ans =1.6331e+016141


Approach when limit depends on direction•>> value_left = limit(tan(x),x,pi/2,'left'),•>> value_right = limit(tan(x),x,pi/2,'right')•Conclusions?•MATLAB's numeric engine gives a finite, albeit verylarge, value. Big mistakes could result if this wereused in subsequent calculations.•The symbolic engine gives both values correctly, butto get them you must add the additional argumenttelling MATLAB from which direction to approach thelimit ('left' beginning with smaller values of x andincreasing to the limit, and 'right' beginning with largervalues of x and decreasing to the limit.142


Review Questions•What command do you use to tell MATLAB that r, sand t are to be symbolic?•>> syms r s t•What command do you use to differentiate sin 2 t ?•>> diff(sin(t)^2,t)•What command do you use to integrate e s from 0 to r?•>> int(exp(s),s,0,r)•What command do you use to evaluate the aboveintegral for r = π/2?•>> subs(int(exp(s),s,0,r),r,pi/2)143


• How do you find cos()/) for = /2?• >> syms alpha beta>> limit(cos(alpha*beta)/beta,beta,pi/2)•What command do you use to find other forms of(3+4x)^4+(2-x)^3+(x/2+10)^2+(3-x) ?•>>simple((3+4*x)^4+(2-x)^3+(x/2+10)^2+(3-x))144

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!