回張智星首頁 │  回四方書網 │  至MATLAB專業討論區 │  至MATLAB專區    
  
by 張智星


章節習題數目
0
第01章 MATLAB小傳與外觀 4
第02章 初探MATLAB 9
第03章 二維平面繪圖 12
第04章 三維立體繪圖 6
第05章 特殊圖形 4
第06章 影像顯示與讀寫 3
第07章 動畫製作 4
第08章 握把式圖形與GUI設計 5
第09章 GUIDE:GUI設計環境 1
第10章 矩陣的處理與運算 5
第11章 字元與字串 3
第12章 多維陣列 2
第13章 異質陣列 8
第14章 結構陣列 3
第15章 稀疏矩陣 1
第16章 MATLAB的運算元 5
第17章 M檔案 5
第18章 程式流程控制 1
第19章 程式除錯 2
第20章 檔案輸出及輸入 2
第21章 程式計時 3
第22章 程式碼與記憶體之最佳化 8
第23章 應用程式介面 4
第24章 線性代數 6
第25章 多項式的處理與分析 4
第26章 一般數學函數的處理與分析 4
第27章 內插法 2
第28章 曲線擬合與迴歸分析 1
第29章 常微分方程式 2
 總數:119



第01章 MATLAB小傳與外觀

  1. 請連上美國 MathWorks 公司的網站 (http://www.mathworks.com),查看看現在大概有多少本 MATLAB-based books (以 MATLAB 為基本軟體,來說明各個專業領域的教科書或工具書)。哪一個領域的 MATLAB-based books 最多?中文書共有幾本?
  2. 若有任何 MATLAB/Simulink 技術上的問題,可以直接連到 MathWorks 公司的技術支援部網站 (http://www.mathworks.com/support) 尋求支援。請在技術支援部網站的搜尋引擎輸入「Web Server」,看會傳回多少和 MATLAB Web Server 相關的資訊。
  3. 請連上台灣鈦思公司(Terasoft Inc.)的網站(http://www.terasoft.com.tw),查看最近有哪些和 MATLAB/Simulink 相關的中文研討會或短期課程。(鈦思科技為美國 MathWorks 公司在台灣的獨家代理商,常舉辦與 MATLAB/Simulink 的相關研討會或課程。)
  4. 請連上任何一個 WWW 的搜尋引擎(例如:http://www.google.com),輸入「MATLAB code for dynamic time warping」,看看是否能在網路上找到 Dynamic Time Warping 的 MATLAB 程式碼。試用同樣的方法,是否能找到 Longest Common Subsequence 的 MATLAB 程式碼。

第02章 初探MATLAB

  1. 請在 MATLAB 下直接輸入下列常數,看它們的值是多少:
    1. i
    2. j
    3. eps
    4. inf
    5. nan
    6. pi
    7. realmax
    8. realmin
  2. 使用 lookfor 指令,找出具有下列功能的 MATLAB 指令。(每一項只需找出一個 MATLAB 指令。)
    1. 找出矩陣的大小(即行維度和列維度)
    2. 改變矩陣的大小(例如將 4X6 的矩陣改成 12X2)
    3. 將矩陣左右翻轉(Left-right flip)
    4. 將矩陣上下翻轉(Up-down flip)
    5. 找出矩陣每一直行的最大值
    6. 對矩陣的每一直行進行排序
    7. 矩陣的旋轉(Rotate)
    8. 反矩陣(Inverse matrix)的計算
    9. 求矩陣的 rank
    10. 計算矩陣的 reduced row echelon form
    11. 計算矩陣的 null space
    12. 計算矩陣的固有值(Eigenvalues)與固有向量(Eigenvectors)
    13. 計算矩陣的 QR 分解(QR Decomposition)
    14. 計算矩陣的 LU 分解(LU Decomposition)
    15. 計算矩陣的奇異值分解(Singular Value Decomposition)
    16. 對向量進行快速傅立葉轉換(Fast Fourier Transform)
    17. 直角座標轉成極座標
    18. 極座標轉成直角座標
  3. MATLAB 的 sqrt 指令可對任一數值進行開平方的運算。用此指令求出下列各數的平方根,並驗算之:
    1. p
    2. 2*i
    3. -5+12*i
    其中 i 是單位虛數。
  4. 寫一個MATLAB小程式 findN.m,求出最小的 n 值,使得 n! > realmax。請問 n 的值是多少?此時 (n-1)! 的值又是多少?
  5. 寫一個 MATLAB 函式 myfun.m 來計算下列方程式:
    y = 0.5*exp(x/3)-x*x*sin(x)
    其中 x 是函式的輸入,y 是函式的輸出。你的函式必須能夠處理當 x 是純量或是向量的兩種情況。此外,請利用下述兩列程式碼來畫出此函數的圖形: x=0:0.1:10; plot(x, myFun(x));
    1. 寫一個 MATLAB 函式 pifun.m 來計算下列級數:
      f(n) = 4*(1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...)
      其中 n 為函式的輸入,級數和 f(n) 則是函式的輸出。
    2. 使用 tic 和 toc 指令來測量 pifun(100000) 的計算時間。如果你不知道如何使用這兩個指令,請使用 help tic 及 help toc 來查出它們的用法。我的電腦是 Pentium 450MHz,所得的計算時間約為 2 秒。請說明你的電腦規格以及其計算時間。
    1. 寫一個 MATLAB 的遞迴函式 fibo.m 來計算 Fibonacci 數列,其定義如下:
      fibo(n+2) = fibo(n+1)+fibo(n)
      此數列的啟始條件如下:
      fibo(1) = 0, fibo(2) = 1.
    2. fibo(25) 的回傳值是多少?
    3. 使用 tic 和 toc 指令來測量 fibo(25) 的計算時間。如果你不知道如何使用這兩個指令,請使用 help tic 及 help toc 來查出它們的用法。我的電腦是 Pentium 2GHz,所得的計算時間約為 3.35 秒。請說明你的電腦規格以及其計算時間。
    4. 如果你修過離散數學,就會知道 Fibonacci 數列的第 n 項可以表示成
      fibo(n)={[(1+a)/2]^(n-1)-[(1-a)/2]^(n-1)}/a
      其中 a 是 5 的平方根。寫利用上式一個 MATLAB 的非遞迴函式 fibo2.m 來計算 Fibonacci 數列。
    5. fibo2(25) 的值為何?是否和 fibo(25) 相同?
    6. 請計算 fibo2(25) 的計算時間,並和 fibo(25) 比較。
    7. 請比較並說明使用 fibo.m 和 fibo2.m 來計算 Fibonacci 數列的優缺點。
    1. 請寫一個函數 minxy.m,其功能是由一個二維矩陣中找出小元素,用法如下:
      [minValue, minIndex] = minxy(matrix)
      其中 matrix 是一個二維矩陣,minValue 則是其元素的最小值,而 minIndex 是一個長度為 2 的正整數向量,代表最小值的索引。(換句話說,matrix(minIndex(1), minIndex(2)) 的值即是 minValue。)
    2. 請測試 [minValue, minIndex] = minxy(magic(20)) 所傳回來的 minValue 和 minIndex 各是多少?
  6. 假設在期中考後,我們用一個向量 x 來儲存每個人的考試成績。請寫一個函式 ranking01.m,輸入為成績向量 x,輸出則是此成績的排名。例如,當 x = [92, 95, 58, 75, 69, 82] 時,ranking(x) 回傳的排名向量則是 [2, 1, 6, 4, 5, 3],代表 92 分是排名第 1,95 分是排名第 2,58 分是排名第 6,等等。

    提示:請盡量利用 sort 指令,而且可以不要用到迴圈(如 for-loop 和 while-loop 等)。(使用迴圈完成此作業也算分。)

第03章 二維平面繪圖

  1. 試寫一函數 regPolygon(n),其功能為畫出一個圓心在 (0, 0)、半徑為 1 的圓,並在圓內畫出一個內接正 n 邊形,其中一頂點位於 (0, 1)。例如 regPolygon(8) 可以畫出如下之正八邊型:
  2. 一條參數式的曲線可由下列方程式表示:
    x = sin(t), y = 1 - cos(t) + t/10
    t 由 0 變化到 4*pi 時,請寫一個 MATLAB 的腳本 plotParam.m,畫出此曲線在 XY 平面的軌跡。
  3. 試寫一函數 regStar(n),其功能為畫出一個圓心在 (0, 0)、半徑為 1 的圓,並在圓內畫出一個內接正 n 星形,其中一頂點位於 (0, 1)。例如 regStar(7) 可以畫出如下之正 7 星型:
  4. 一個平面上的橢圓可以表示成下列方程式:
    (x/a)2 + (y/b)2 = 1
    我們也可以用參數式將橢圓表示成:
    x = a*cos(q)
    y = b*sin(q)
    請利用上述參數式,畫出一個橢圓,其中 a = 5,b = 3,而且橢圓上共有100個點。例如,ellipse(7, 2) 可以產生下列圖形:
  5. 請用寫一個 MATLAB 腳本 figSolve.m,利用圖解法,說明下列聯立方程式有無窮多組解:
    • y = x
    • y = sin(1/x)
    (請務必畫出上述兩條曲線來加以說明之。)
  6. 利薩如圖形可用下列參數式來表示:
    x = cos(m*q)
    y = sin(n*q)
    試畫出在不同 m、n 值的利薩如圖形:
    • m = n = 1
    • m = 3, n = 2
    • m = 10, n = 11
  7. Chebysheve 多項式的定義如下:
    y=cos(m*cos-1(x))
    其中 x 的值介於 [-1, 1]。當 m 的值由 1 變化到 5,我們可得到五條曲線。請將這五條曲線畫在同一張圖上面,記得要使用 legend 指令來標明每一條曲線。
  8. 使用 contour 指令畫出下列隱函數:
    x2+y2=25

    提示:畫出 z=x2+y2 在高度等於 25 的一條等高線。
  9. 使用 MATLAB 畫一個圓心在原點、半徑等於 10 的圓,並在圓周上依逆時鐘方向取任意四點 A、B、C、D,將線段 AB、AC、AD、BC、BD、CD 用直線畫出。
    • 計算線段 AB、AC、AD、BC、BD、CD 的長度。
    • 計算 AB*CD+AD*BC 和 AC*BD。兩者的差距有多少?是否可視為相等?
    (上述定理稱為 Ptolemy 定理,你若能用國中所學的古典幾何方式來證明此定理,將有加分。)
  10. 當一個小圓輪在平面上滾動時,輪緣的一點在滾動時所形成的軌跡稱為「擺線」。請用 MATLAB 畫出一個典型的擺線,其中小圓輪的半徑為 1,而且至少要滾三圈。
  11. 此題和上題類似。當一個小圓輪沿著一條曲線行進時,輪緣任一點的軌跡就會產生變化豐富的擺線。假設小圓輪的半徑 r=2。
    • 當小圓輪繞著一個大圓(半徑 R=5)的外部滾動時,請畫出其擺線。
    • 重複上小題,但改成在大圓的內部滾動。

    提示:下圖顯示在不同的 R 和 r 值,所產生的擺線(或稱「花瓣線」較恰當):
    很炫吧!
  12. 若大圓和小圓的半徑成整數比,當小圓在大圓的內部滾動時,小圓內的任一點 A 的軌跡就會形成一個漂亮無缺的花瓣線。當大圓半徑 R 為 10,小圓半徑 r 為 3,且 A 點離小圓圓心距離 r1 為 2 時,請畫出此完整的花瓣線。

    提示:不同 r1 值所產生的內花瓣線:
    外花瓣線:
    是不是有點像「萬花筒」呢?

第04章 三維立體繪圖

  1. 請畫出下列圓椎曲面的三度空間曲面圖及其10條等高線:
    1. z = xy
    2. z = x2 + 2xy + y2
    3. z = x2 + 2xy + 2y2
    4. z = x2 - 2xy - y2
    上述各方程式的定義域皆是 [-10, 10] x [-10, 10]。
  2. 畫出下列方程式的曲面圖及等高線圖:
    z = sin(x/2)*cos(y)
    其中,x 的 21 個值均勻分佈在 [-2*pi, 2*pi] 範圍,y 的 31 值均勻分佈在 [-1.5*pi, 1.5*pi]。請使用 subplot(2,1,1) 和 subplot(2,1,2) 將產生的曲面圖和等高線圖秀在同一個視窗上,產生的圖形應類似下圖:
  3. 請用 meshc 指令來同時畫出下列函數的曲面圖和等高線圖:
    z = xy/(x+y)
    其中 x 和 y 都介於 0 和 1 中間,且各自都分成 21 個格子點,所以此曲面共有 21*21=441 個點。此外,等高線圖應有 20 條。請問此曲面在 XY 平面的哪一點(或區域)會有最大值?此最大值為何?
  4. 請用 surf 指令來畫出下列函數的曲面圖:
    z = x*exp(-x2-y2)
    其中 x 在 [-2, 2] 間共等切分為 21 點,y 在 [-1, 1] 間共等切分為 21 點,所以此曲面共有 21*21=441 個點。
    1. 請用預設的顏色對應表(Colormap)來畫出此曲面。
    2. 請以曲面的斜率來設定曲面的顏色。
    3. 請以曲面的曲率來設定曲面的顏色。
  5. 一個空間中的橢球可以表示成下列方程式:
    (x/a)2 + (y/b)2 + (z/c)2 = 1
    請使用任何你可以想到的方法,畫出三度空間中的一個平滑的橢球,其中 a = 3,b = 4,c = 8。
  6. (腦力激盪題)我們可用 subplot 在同一個視窗畫出兩個不同的曲面圖。你是否可想出一個聰明的辦法,讓這兩個曲面圖各自用到不同的顏色對應表?請舉例說明。

第05章 特殊圖形

  1. 假設清華大學資訊系在2001、2002及2003年的人員組成如下表所示:

    類別
    大一大二大三大四碩一碩二博士班教職員
    年份20011021231435264748
    20022132332435261748
    20031523234425342738

    1. 請用 bar3 指令來畫出上述資料的立體長條圖。
    2. 請用各種你可以想到的方法,在上述圖形中加入各種解釋和說明的文字。
  2. 請使用上題的資料來進行下列兩小題:
    1. 畫出依每年份總人數來切分的立體扇形圖,並加上各種可能的說明文字。
    2. 重覆上小題,但改成依每種類別的總人數來切分。
  3. 假設有一圓球半徑為1,圓心在 (0,0,0),試畫出此圓球的上半部,並將其30條等高線同時畫在曲面的下方。

    提示:使用meshc指令。
  4. 本題為作圖題:
    1. 參考課本的例子,畫出 f(z) = |(z.^4-1)1/4| 在極座標上的等高線圖。
    2. 使用 cpLxgrid 及cplxmap 指令,畫出上述函數在極座標上的曲面圖。

第06章 影像顯示與讀寫

  1. 讀入mandrill.mat 資料檔,將色盤矩陣設為 1-map 後,顯示此負片效果的狒狒影像,並將此影像存成一個 bmp 的檔案.
  2. 讀入位於 clown.mat 內的小丑影像,顯示影像,並將 colormap 改成 gray,你會發覺小丑的影像偏暗,請調整色盤矩陣,使其明亮度提高。
  3. 讀入位於 mandrill.mat 的狒狒影像,想辦法調整 X 及 map,使得呈現的影像是由全黑或全白的像素所組成,而且其個數比例大約是1:1。

    提示:使用 median 指令找出 X(:) 的中位數。

第07章 動畫製作

  1. 以電影方式產生包含 21 個畫面的動畫,代表 peaks 曲面乘上 a,其中 a 的值由 -1 至 1 等分切成 21 點。
  2. 以電影方式產生包含 21 個畫面的動畫,代表位於 clown.mat 中的小丑影像,但其色盤矩陣將由 map 等距轉換成 1-map,因此電影將呈現小丑影像由正片漸轉成負片的效果。
  3. 以物件方式產生動畫,呈現一小圓(半徑為1)在一大圓(半徑為3)的圓周外部滾動的動畫。
  4. 以物件的方式產生動畫,呈現下列方程式:
    y = cos2(x+k)*exp(-x/5)
    讓 k 隨時間而變大,來顯示此方程式的動畫。

第08章 握把式圖形與GUI設計

  1. 畫出 y=sin(x) 的圖形,其中 x 的範圍是 0 到 4*pi。當滑鼠在圖軸內點選時,你的程式應能找出最近的資料點,並將此資料點的座標顯示在 MATLAB 命令視窗內。
  2. 畫出一個三角形,及其三條中線(頂點和對邊中點的連線)。當使用者拖放三個頂點時,三角形應隨之變形,並立即顯示三條中線及重心。
  3. 重複上題,但將中線改成經由頂點的垂線,重心改成垂心。
  4. 畫出一個三角形,及其三條角平分線。當使用者拖放三個頂點時,三角形應隨之變形,並立即顯示三條角平分線及內心,並畫出此三角形的內接圓。
  5. 重複上題,但將三頂點的角平分線改成三邊的垂直平分線,內心改成外心,內切圓改為外接圓。

第09章 GUIDE:GUI設計環境

  1. 請使用 GUIDE 來寫出一個圖形使用者介面的程式,其功能為讀入不同的現成影像檔(隨 MATLAB 而來的影像檔有 clown.mat、mandrill.mat、cape.mat、durer.mat、detail.mat、earth.mat、gatlin.mat、spine.mat),呈現影像於視窗中,使用者並能將影像匯出成不同的檔案格式,如 bmp、tiff、jpeg及png等。

    提示:請使用 imwrite 指令,並參考第六章對影像的說明。

第10章 矩陣的處理與運算

  1. 在數學上,我們可以證明:一個方陣的行列式,會等於它的 eigenvalue 的乘積。試寫一個 MATLAB 程式,任意產生不同維度的 10 個方陣,來驗證上述恆等式。
  2. tr(A) 定義為方陣 A 的主對角線元素的和,在數學上,只要矩陣 A 和矩陣 B 的乘積是一個方陣,我們可以證明 tr(AB)=tr(BA)。試寫一個 MATLAB 程式,任意產生不同維度的 10 組 A、B,以驗證上述恆等式。
  3. 設計一個函數 idx2pos.m,其用法如下:
    position = idx2pos(index);
    其中 index 是一個元素為正整數的向量,position 則是此函數的輸出矩陣,其列數為 index 元素的最大值,行數則是 index 的元素個數,而且當 index(i) = j 時,position 的第 i 行中,只有第 j 個元素為 1,其餘為零。例如,當 index 是 [1 3 5 2] 時,傳回的 position 是
  4. 設計一個函數 copyMatrix.m,其用法如下:
    bigMatrix = copyMatrix(matrix, p, q);
    其中 matrix 是一個輸入矩陣,p 和 q 是正整數,函數 copyMatrix 的作用是將 matrix 視為一個元素,並將之複製成 p x q 的大矩陣 bigMatrix,其列數為 p*size(matrix,1),行數為 q*size(matrix,2)。例如,當 a = [1 2; 3 4] 時,copyMatrix(a, 2, 5) 所產生的輸出矩陣是:
  5. 設計一個函數 copyElement.m,其用法如下:
    bigMatrix = copyElement(matrix, p, q);
    其中 matrix 是一個輸入矩陣,p 和 q 是正整數,函數 copyElement 的作用是將 matrix 的每一個元素複製成 p x q 的矩陣後,在合成一個大矩陣 bigMatrix,其列數為 p*size(matrix,1),行數為 q*size(matrix,2)。例如,當 a = [1 2; 3 4] 時,copyElement(a, 2, 5) 所產生的輸出矩陣是:

第11章 字元與字串

  1. 中文的大五碼是由兩個位元組所構成,但不幸的是,在當初編碼的過程中,可能考慮欠周詳,因此把「直槓」也編成某些字的大五碼的一部份,因此造成在自串處理上的極大不方便。(例如 Perl 的 Regular Expressions 碰到含有一直槓的大五碼就會出問題;使用 ODBC 來執行 SQL Command 時,若碰到含有一直槓的大五碼,也會出問題。此外,若用這些出問題的大五碼來當檔案或目錄名稱,則在使用 FTP 來進行檔案傳輸時,也會遇到麻煩而無法傳輸。)請寫一段 MATLAB 程式,來印出含有一直槓的所有中文字。

    以下是Big5的範圍 :

    big5 = (hb * 2^8) + lb (lb <= 126 and lb >= 64) or(lb <= 254 and lb>=161) (big5 >= 41281 and big5 <= 41915) or (big5 >= 41917 and big5 <= 41919) or (big5 >= 42048 and big5 <= 50814) or (big5 >= 50849 and big5 <= 51411) or (big5 >= 51520 and big5 <= 63998) 舉個例子來說,「會」這個字是由兩個byte組成(B7 和 7C),把 B77C 轉成十進位就變成46972,的確是落在上述的Big5範圍之內,而「7C」就是題目裡面提到「直槓」的ASCII碼 所以只要在Big5的範圍內,找含有「7C」這個 byte的中文字,那就是解答啦。

    algorithm pseudo-code:

    for hb=1 to 254 for lb=1 to 254 big5 = (hb * 2^8) + lb if ((lb <= 126 and lb >= 64) or (lb <= 254 and lb>=161)) and ((big5 >= 41281 and big5 <= 41915) or (big5 >= 41917 and big5 <= 41919) or (big5 >= 42048 and big5 <= 50814) or (big5 >= 50849 and big5 <= 51411) or (big5 >= 51520 and big5 <= 63998)) word=chr(big5) ...... endif endfor endfor
  2. 請寫一段 MATLAB 程式,計算上個習題的描述文字中,共出現多少個不同的「二字詞」(任何相鄰兩個字即構成一個二字詞),以及每個「二字詞」出現的頻率(即個數)。請將結果按頻率由高而低來印出。請對「三字詞」及「四字詞」進行類似的運算。
  3. 設計一個函數 captalize.m,其用法如下:
    outputStr = catalize(inputStr)
    其中 inputStr 是一個輸入英文字串,函數 captalize 會將此字串中,每個字(Word)的第一個字母改成大寫,其餘則為小寫,並將多個空格代換成一個空格,outputStr 則是最後的輸出字串。例如,當輸入是 'you are My sunshine' 時,所得到的輸出字串是 'You Are My Sunshine'。

第12章 多維陣列

  1. 假設資訊系及電機系在下列各年度的人口統計下:

    資訊系:

    類別
    大一新生學士畢業生碩士畢業生博士畢業生
    年份20019894805
    200210597876
    2003121110898

    電機系:

    類別
    大一新生學士畢業生碩士畢業生博士畢業生
    年份200199988510
    20021131018712
    20031201158015

    試用一個 3 維矩陣 A 來表示上述資料。

  2. 由上題的矩陣 A 來算出下列各數值:
    1. 資訊系在2001、2002 和2003 年之間的每年平均新生、學士畢業生、碩士畢業生及博士畢業生的個數。
    2. 資訊系和電機系在各個年度的新生總數。
    3. 3 年來電機系和資訊系共畢業多少位碩士生?
    4. 3 年來電機系和資訊系共有多少畢業生?
    5. 在哪一年,電機系和資訊系合計有最多的碩士畢業生?
    6. 在哪一年,電機系和資訊系的學士畢業生差額最大?
    7. 在哪幾年,電機系收的新生數目比資訊系多?
    8. 資訊系三年來每年的學士畢業生對大一新生的比例平均值為何?

第13章 異質陣列

  1. 請建立下列 4X3 的異質陣列A:
    張惠妹聽海1998
    周華健花心1992
    王傑一場遊戲一場夢1988
    孫燕姿超快感2000
  2. 在上題異質陣列中,每一橫列代表一筆資料,我們要用不同的方法來排序:
    1. 請依歌星名字內碼來排序,產生新的異質陣列 B。
    2. 請依年代來排序,產生新的異質陣列 C。
    3. 請依歌名字數來排序,產生新的異質陣列 D。(若字數相同,則用內碼來排序。)
  3. 在上題的異質陣列中,求出年代的最大值、最小值、平均值及中位數。
  4. 請寫一個函數 findcellstr.m,可以找出一個異值字串陣列(Cell string array)中的某一個特定字串。其用法如下:
    index = findcellstr(cellstr, str)
    其中 cellstr 是一個異值字串陣列,str 是一個字串,index 則是 str 在 cellstr 中出現的索引值。例如當 cellstr 是 {'ab', 'xyz', 'ab', 'cde'} ,str 是 'ab' 時,所傳回的 index 是 [1, 3]。
  5. 請寫一個函數 getfile.m,其用法如下:
    cellStr = getfile(fileName)
    其中,輸入引數 fileName 是一個字串,代表檔案名稱,輸出引數 cellStr 則是一個異值字串陣列,陣列的每一個元素都是一個字串,代表原檔案中的每一列資料。
  6. 請寫一個函數 split.m,其用法如下:
    tokenList = split(str, delimiter)
    其中,str 是一個輸入字串,delimiter 則是一個字元,此函數會將 str 依照 delimiter 的位置而拆開來,並將結果放入一個以異質字串陣列 tokenList。例如,split('This#is#a#test#string', '#') 產生的結果是{'This', 'is', 'a', 'test', 'string.'}。
  7. 請寫一個函數 getfile.m,其用法如下:
    cellStr = getfile(fileName)
    其中,輸入引數 fileName 是一個字串,代表檔案名稱,輸出引數 cellStr 則是一個異質陣列,陣列的每一個元素都是一個字串,代表原檔案中的每一列資料。
  8. 請寫一個函數 split.m,其用法如下:
    tokenList = split(str, delimiter)
    其中,str 是一個輸入字串,delimiter 則是一個字元,此函數會將 str 依照 delimiter 的位置而拆開來,並將結果放入一個以字串為元素的異質陣列 tokenList。例如,split('This#is#a#test#string', '#') 產生的結果是 {'This', 'is', 'a', 'test', 'string.'}。

第14章 結構陣列

  1. 假設一異質陣列 A 的內容如下:
    張惠妹聽海1998
    周華健花心1992
    王傑一場遊戲一場夢1988
    孫燕姿超快感2000

    試將此異質陣列 A 轉成結構陣列 song,其中:

    song(1).singer='張惠妹' song(1).name ='聽海' song(1).year ='1998' song(2).singer='周華健' ...
  2. 此題用到上題的結構陣列 sony。
    1. 請將結構陣列 sony 依歌星名字內碼來排序。
    2. 請將結構陣列 sony 依年代來排序。
  3. 此題用到上題的結構陣列 sony。
    1. 請取出所有歌星的名字,存成一個字串異質陣列。
    2. 請取出所有的年代,存成一個向量。

第15章 稀疏矩陣

  1. 假設有一個 100X100 的矩陣 A,其元素大部分是零,只有下列幾個特定元素不為零: A(1, 3)=4 A(2, 5)=10 A(35, 70)=4 A(54, 98)=5
    1. 請用 sparse 指令來建立此稀疏矩陣 A。
    2. A 佔掉多少位元組?
    3. 若 A 是完全矩陣,且是 double 的資料型態,則會佔去多少位元組?
    4. 若 A 是完全矩陣,且是 uint8 的資料型態,則會佔去多少位元組?
    5. 使用 spy 來畫出非零元素的分佈狀況。

第16章 MATLAB的運算元

  1. 假設一矩陣 A 可表示如下:
    0.30.10.2
    0.20.70.4
    0.50.20.4

    試找出最小的 n 值使得 An+1=An。此時 An值為何?

  2. 給定一實數矩陣 A,請寫一列敘述,將其所有非正元素設定成零。
  3. 給定一實數矩陣 A,請寫一列敘述,將其所有 nan 元素設定成零。
  4. 給定一實數和複數交錯的矩陣 A,請寫一列敘述,將其所有複數元素設定成 nan。
  5. 請寫一列敘述,產生元素值為 0 或 1 的向量,向量長度為 100,且出現 0 或 1 的機率各佔一半。

第17章 M檔案

  1. 撰寫一函式 project1.m,其輸出入的格式如下:
    out = project1(x, u)
    其中 x 和 u 是維度相同的向量,out 則是 x 在 u 方向的投影量的平方值。
  2. 撰寫一函式 quadzero.m,其輸出入的格式如下:
    root = quadzero(coef)
    其中 coef 是一個 3x1 的向量,代表一個一元二次方程式的係數(降冪排列),而 root 則是此方程式的根所形成的向量。若 coef(1) 不是零,則 roots 的長度為二。若 coef(1) 是零,則可能有一解(root 的長度為一)或無解(root為空矩陣)。(請注意:你的程式碼必須套用 a*x2+b*x+c=0 的公式來解此題,而不可以直接使用 roots 指令來解此題。)
  3. 由基本代數可知,一個實係數的一元三次方程式,必有一個實數解。請寫一函式 trizero.m,其輸出入的格式如下:
    root = trizero(coef)
    其中 coef 是是一個 4x1 的向量,代表一個一元三次方程式的係數(降冪排列),而 root 則是一個 3x1 的向量,代表此方程式的三個根。(為簡化題目,我們假設 coef(1) 不等於零,因此一定會有三個根。)請參照下列步驟來撰寫你的程式:
    1. 使用 fzero 指令來找出此方程式的實樹根 x1。
    2. 使用 deconv 指令來算出將此多項式除以 (x-x1) 後得到的商式。
    3. 使用前一個習題的函式來找出此商式的根。
  4. 寫一個 MATLAB 遞迴函式 combinat.m,其功能是可對輸入字串進行組合。例如,「combinat('abcd', 2)」所傳回的字串矩陣是
     
    ab 
    ac 
    ad 
    bc 
    bd 
    cd 
    
    此字串矩陣的每一列代表從輸入字串任取兩個字元時,所有可能的組合。(你的排列順序不見得要和上例完全一樣。)為求簡單起見,我們可假設輸入字串並沒有重複的字元。
  5. 寫一個 MATLAB 遞迴函式 permute.m,其功能是可對輸入字串進行排列。例如,當輸入字串為 'abc' 時,此函式所傳回的字串矩陣是
     
    abc 
    acb 
    bca 
    bac 
    cab 
    cba 
    
    此字串矩陣的每一列代表輸入字串所有可能的排列。(你的排列順序不見得要和上例完全一樣。)為求簡單起見,我們可假設輸入字串並沒有重複的字元。

第18章 程式流程控制

  1. 給定一向量 A,依其元素值不同,我們要印出不同訊息。舉例而言,當 A=[-1, 1, 0, 2+i] 時,你的程式碼應印出: A(1)=-1 是負數 A(2)=1 是正數 A(3)=0 是零 A(4)=2+i 是複數 請用下列 A 來測試你的程式:
    A=randn(20,1)+(rand(20,1)>0.7)*i;

第19章 程式除錯

  1. 下列程式碼計算由 1 至 500 的總和,但在 MATLAB 下執行時,會發生錯誤。請指出錯誤所在,並修改之。 begin = 1; end = 500; vector = begin:end; total = sum(vector); % 計算向量總和 fprintf('The sum of %g to %g is %g.\n', begin, end, total); % 列印結果

    提示:此題相當簡單,不需用到 MATLAB 除錯器
  2. 下列程式碼計算由 1 至 1000 的平均值,並和 MATLAB 內建函數比較計算結果。但在 MATLAB 下執行此段程式碼時,會發生錯誤。請指出錯誤所在,並修改之。 clear all % 清除所有變數 vector = 1:1000; total = 0; for i=vector, total = total+i; end mean = total/1000; % 用我的方法算平均值 mean2 = mean(vector); % 用 MATLAB 內建函數 mean 來算平均值 fprintf('Difference in computation: %g.\n', abs(mean-mean2)); % 列出誤差

    提示:此題相當簡單,不需用到 MATLAB 除錯器

第20章 檔案輸出及輸入

  1. 假設有一整數矩陣 A,請寫一函式,將此整數矩陣以 ASCII 的整數方式儲存於檔案之中。 例如當矩陣 A 的內容如下時:
    1234
    5678
    則儲存於檔案之內容為 1 2 3 4 4 5 6 7
  2. 本題讓各位同學練習二進制檔案的讀寫。
    1. 請將 A=magic(10) 的資料以 uint8 的資料型態存入一個二進制檔案 mytest.bin,使用指令為 fwrite。
    2. 請再用 fread 指令將此魔方陣讀至工作空間的一個變數。

第21章 程式計時

  1. 使用 tic 和 toc 指令,算出計算 inv(rand(n)) 所須的時間 t,並將此時間 t 對 n 作圖,n 的值是從10到200,以得到 t 對 n 的關係圖。
  2. 重複上題,但改對 eig(randn(n)) 進行計時及繪圖。
  3. 請使用 profile 指令,計算在下列程式碼中,共做了幾次加法運算:
    polyfit(rand(100,1), rand(100,1), 25);

第22章 程式碼與記憶體之最佳化

  1. 假設在期中考後,我們用一個向量 x 來儲存每個人的考試成績。請寫一個函式 ranking01.m,輸入為成績向量 x,輸出則是此成績的排名。例如,當 x = [92, 95, 58, 75, 69, 82] 時,ranking02(x) 回傳的排名向量則是 [2, 1, 6, 4, 5, 3],代表 92 分是排名第 1,95 分是排名第 2,58 分是排名第 6,等等。(此題限用向量化的方法來做,不可使用迴圈。)

    提示:可使用 sort 指令。
  2. 請寫一個函式 localmax.m,可用來算出一個向量的局部最大值(Local Maxima)出現的位置。一個元素若比它左右相鄰元素都大,就是一個局部最大值。(若是此元素在起頭或結束的位置,那麼它只要比它的一個相鄰元素大,就是局部最大值。)此函式的輸出入格式如下:
    maxIndex = localmax(vector)
    其中輸出變數 maxIndex 是一個 0-1 的向量,其大小和輸入向量 vector 相同。若 vector(i) 是一個局部最大值,則 maxIndex(i) 為 0,否則為 1。如果你的程式碼是完全向量化的(Fully vectorized),將有加分。
  3. 請寫一個函式 zerocros.m,可用來算出一個向量的過零率(Zero crossing rate),定義為相鄰元素穿越零點的個數,其輸出入格式如下:
    count = zerocros(vector)
    其中輸出變數 count 代表向量 vector 中,相鄰元素穿越零點的個數,此即為相鄰元素異號的個數。如果你的程式碼是完全向量化的(Fully vectorized),將有加分。
  4. 寫一個 MATLAB 函式 vecfind.m,其輸出入格式如下:
    index = vecfind(x, y)
    其中 x 和 y 都是向量,index(i) 是 y(i) 出現於向量 x 的位置。例如,當 x = [6 2 4 1] 且 y = [4 6] 時,vecfind 傳回的值是 [3 1],分別代表 4(y(1) 的值)和 6(y(2) 的值)在向量 x 的位置。(為簡化題目起見,我們假設向量 y 的每一個元素一定會出現在向量 x 裡,而且最多只出現一次。)如果你的程式碼是完全向量化的(Fully vectorized),將有加分。

    提示:你的程式碼將會用到 find 指令。
  5. 寫一個 MATLAB 函式 cutshort.m,其功能為將「個數小於4、連續的非 nan元素」改為 nan。例如,當輸入為下列向量時:
    [nan 5 3 5 6 3 nan nan 3 4 5 nan 2 nan nan 1 2 3 6]
    cutshort.m傳回的向量為
    [nan 5 3 5 6 3 nan nan nan nan nan nan nan nan nan 1 2 3 6]
    其中 [3 4 5] 和 [2] 被代換成 [nan nan nan] 及 [nan],因為它們都是「個數小於4、連續的非 nan元素」。如果你的程式碼是完全向量化的(Fully vectorized),將有加分。
  6. 寫一個 MATLAB 函式 maxcount.m,其輸出入格式如下:
    out = maxcount(vector, element)
    其中 vector 是一個向量,element 是一個純量,out 則是 element 連續出現於向量 vector 中的最大次數。例如,當 vector = [1 2 2 3 3 4 2 2 2 3 2 2 2 2 2 3 1 2] 且 element = 2 時,maxcount 傳回的值是 5,代表 2 在 vector 裡連續出現的最大個數為 5。如果你的程式碼是完全向量化的(Fully vectorized),將有加分。
  7. 一個 d 維的高斯機率密度函數(Gaussian probability density function)可以表示成:
    g(x, m, S) = (2p)-d/2*det(S)-0.5*exp[-(x-m)TS-1(x-m)/2]
    其中 m 是此高斯機率密度函數的平均向量(Mean vector),S 則是其共變異矩陣(Covariance matrix)。試寫一個函式 gaussian.m,其輸出入格式如下:
    out = gaussian(x, mu, sigma)
    其中 mu 是此高斯機率密度函數的平均向量,sigma 是其共變異矩陣,x 則是一個輸入矩陣,其每一列代表此高斯機率密度函數的輸入向量,而 out 則是一個向量,out(i) 代表輸入向量 x(i, :) 在此高斯機率密度函數的值。如果你的程式碼是完全向量化的(Fully vectorized),將有加分。
  8. 請寫一個函式 countele.m,可用來算出一個向量中,不同的元素各有幾個,其輸出入格式如下:
    [sorted, count] = countele(vector)
    其中 sorted 是在 vector 中,所有不同元素經排序後所得的向量,count(i) 則是 sorted(i) 在 vector 中出現的個數。如果你的程式碼是完全向量化的(Fully vectorized),將有加分。

第23章 應用程式介面

  1. 請寫一個 mex 檔案 acfmex.c,來計算一個向量的自相關函數(Auto correlation function),其輸入為一個向量 x,輸出為向量 y,其中 y(i) 為 x 向右平移 (i-1) 個單位後,與原向量重覆部分的內積。若輸入矩陣,則你的程式應針對每一個行向量進行運算,並傳回一個與原矩陣維度相同的另一個矩陣。
  2. 請寫一個 mex 檔案 nanmeanmex.c,來計算一個向量的平均值,若向量中出現 nan 元素,則此元素不用於計算平均值。若輸入矩陣,則你的程式應針對每一個行向量進行運算,並傳回一個列向量。

    提示:你的程式會用到 mxIsNan() 的 API 函式,用以判定一個矩陣的元素是不是 NaN。
  3. 請寫一個 mex 檔案 medianmex.c,來計算一個向量的中位數(Median),若向量中出現 nan 元素,則此元素不用於計算中位數。若輸入矩陣,則你的程式應針對每一個行向量進行運算,並傳回一個列向量。

    提示:你的程式會用到 mxIsNan() 的 API 函式,用以判定一個矩陣的元素是不是 NaN。
  4. 請寫一個 mex 檔案 myfindmex.c,來尋找某個數值是否出現在一個矩陣之中。其用法如下:
    • index = myfindmex(array, x)
      其中 array 是所給的矩陣,x 是欲尋找的數值,index 則是所找到的矩陣索引。(此用法和 index = find(array==x) 是一樣的。)由於在 array 中的數值並無大小關係,所以你的程式碼必須採用 linear search 來找出所有 x 可能出現的位置。
    • index = myfindmex(array, x, 1)
      在此種用法下,你的程式會假設 array 是已經排序過,所以會直接採用 binary search 來以最快速的方法來找出 x 所在的索引。
    為簡化題目,我們可以假設 array 和 x 都是實數。

第24章 線性代數

  1. 請依下列步驟進行此作業:
    1. 使用 randn 產生一個 10X10 的矩陣 A。
    2. 計算 B=(A+A')/2。請注意,B 一定是一個對稱矩陣。
    3. 計算矩陣 B 的固有向量 e1, e2, ... e10
    4. 驗證在 i 不等於 j 的情況下,ei 和 ej 的內積必定為零。
  2. 我們可用數學證明:一個方陣的行列式值會等於其固有值的乘積。請隨意產生 10 個 100X100 的方陣來驗證上述定理。
  3. 我們可用數學證明:一個方陣的主對角線的元素和,會等於其固有值的和。請隨意產生 10 個 100X100 的方陣來驗證上述定理。
  4. 試用 MATLAB的「左除」運算,找出最接近下列五點的最小平方三次多項式:
    (1, 5) (2, 3) (3, 4) (4, 7) (5, 2)
    請畫出此多項式及這五點資料。
  5. 在xy平面上有三條曲線: 2x-y = 2 x-2y = -2 x+y = 1 試用 MATLAB的「左除」找出一點 P,使得 P 到三條直線的距離平方和為最小。
  6. 試用 MATLAB 的「左除」運算,找出下列聯立方程式的最小平方解: 3x+2y = 1 x+3y = 4 4x+2y = 3 x-y = 6 此時最小平方誤差是多少?

第25章 多項式的處理與分析

  1. 試用 roots 指令算出 x3+2x2+x+1=0 的根。
  2. 若向量 v 等於 [x2, x, 1]T,則上題的方程式可以寫成下列矩陣方程式:
    A*v = x*v
    換句話說,此時 x 就變成 A 的固有值,而 v 則是 A 的固有向量.
    1. A 是多少?
    2. A 的固有值為何?和第一題的答案是否相同?
  3. 試用 residue 指令來計算下列運算式的部分分式展開:
    3s2+5s+2
    -----------------------
    (s+1)3(s2+1)
    同時再利用 residue 指令,驗算所得答案是否正確。

    提示:請查看 residue 的線上說明。
  4. 若 y=rand(10,1),請用一個 9 次的多項式,來通過 (i, y(i)), i=1~10。請畫出此多項式及十點資料點。

第26章 一般數學函數的處理與分析

  1. 下列聯立方程式有無窮多組交點:
    • y = x
    • y = sin(1/x)
    1. 假設這些交點可以表示成 (x1, y1), (x2, y2), (x3, y3)..., 而且 x1 > x2 > x3...。請用 root 指令,找出 x1, x2, x3
    2. 請畫出代表上述兩個方程式的曲線,並用小圓圈標出 成 (x1, y1), (x2, y2), (x3, y3) 的位置,以驗證你在前一小題的答案。
    3. 在 XY 平面上給定三點 A、B、C,找出另外一點 X,使得 X 到 A、B、C 三點的距離和為最小。請寫一個函式 mindist.m 解決上述問題,此函式的輸出入格式如下:
      x = mindist(a, b, c)
      其中 a、b、c 為三點的座標,x 則是輸出點的座標,你必須使用 fminsearch 指令來進行最佳化。
      • 當 a = [4 0]、b = [0 3]、c = [0 0] 時,mindist.m 所傳回的 x 值為何?對應的最短距離和為何?
      • 在上小題中,當最短距離和發生時,角度 axb、bxc、cxa 各是多少?
    4. 在 XY 平面上給定三點 A、B、C,找出另外一點 X,使得 X 到 A、B、C 三點的距離平方和為最小。請寫一個函式 mindist2.m 解決上述問題,此函式的輸出入格式如下:
      x = mindist2(a, b, c)
      其中 a、b、c 為三點的座標,x 則是輸出點的座標,你必須使用 fminsearch 指令來進行最佳化。
      • 當 a = [4 0]、b = [0 3]、c = [0 0] 時,mindist2.m 所傳回的 x 值為何?對應的最短距離平方和為何?
      • 在上小題中,當最短距離平方和發生時,x-(a+b+c)/3 的長度是多少?
    5. 在 XY 平面上給定一組向量 x1, x2, ... xn,請找出另一向量 u,使得這一組向量在 u 方向的投影量平方和為最小。請寫一個函式 minproj.m 解決上述問題,此函式的輸出入格式如下:
      u = minproj(X)
      其中 X 的每一個橫列即是向量 xi, i = 1, ..., n,而 u 是一個長度為一的向量,代表最佳的投影方向。你必須使用 fminsearch 指令來進行最佳化。

    第27章 內插法

    1. 假設一曲線資料點為 x = 0:2:4*pi; y = sin(x).*exp(-x/5); 試將 x 的間距調成 0.1,並用下列方法進行內插:
      1. 線性內插法 (method='linear')。
      2. Spline 內插法 (method='spline')。
      3. 三次多項式內插法 (method='cubic')。
      4. 多項式擬合法:直接利用 6 次多項式去通過 7 個資料點。
      請將這些內插的結果及原先的資料點畫在同一個圖。
    2. 假設一曲面的資料點為 [x, y] = meshgrid(-2:0.4:2, -1:0.2:1); z = x.*exp(-x.^2-y.^2); 試將 x 的間距調為 0.1,y 的間距調為 0.05,並用下列三種方法進行二維內插:
      1. 鄰近點內插法 (method='nearest')。
      2. 二維線性內插法 (method='bilinear')。
      3. 二維 spline 內插法 (method='spline')。
      請畫出原曲面及三個經過內插的曲面,以及它們的等高線圖。

    第28章 曲線擬合與迴歸分析

    1. 假設我們的數學模型如下:
      y = a1*xb1+a2*xb2
      而資料點如下:
      x 值12345678910
      y 值2144390160255378530715930

      試用下述兩種方法求出參數 a1、a2、b1、b2 的最佳值,並算出最小平方誤差總和。

      1. 將 a1、a2、b1、b2 全視為非線性參數,以 fminsearch 來求出最佳參數值。
      2. 將 a1、a2 視為線性參數,使用「左除」來計算之;並將 b1、b2 視為非線性參數,使用 fminsearch 來求出其最佳值。

    第29章 常微分方程式

    1. 請用 ode45 解下列微分方程式:
      y'''+y''+y'=0
      假設啟始條件為:y(0)=10,y'(0)=4,y''(0)=3。時間 t 由 0 到 50 秒。
      1. 請畫出 y(t)、y'(t)以及 y''(t) 對時間 t 的作圖。
      2. 請畫出在三度相位空間的曲線圖。
    2. 請用 ode45 解下列微分方程式:
      dx1/dt=-x2(x3-1)
      dx2/dt=x1(x3-3)
      dx3/dt=x1x2
      假設啟始條件為 [1 sqrt(6) 0],時間由 0 到 200 秒。
      1. 請畫出每個狀態變數對時間的作圖。
      2. 請畫出在三度相位空間的曲線圖。

    您是來自 54.87.90.21 的貴賓,您已光臨本站1次。 (Total page hits: 45,706since August 7, 2000.)

      本網頁由清蔚科技股份有限公司所維護,
    如有問題,請
    E-mail Comment@CWeb.com.tw