Matlab 教材:Matlab 搜尋路徑

這一節是繼續前一節關於的 M-file 的說明,而且假設您已經有了 foo.m 或者 eigshow.m 這兩個檔案 (之一)。 如果有必要,請回去準備好再來。

上一節說 M-file 必須

  1. 是一個純文字檔案
  2. 在 Matlab 的「搜尋路徑」上
現在就講解 Matlab 的搜尋路徑。

Matlab 提供成千上萬的函式。 只有少部份最重要、最通用的函式放在「核心」裡面, 例如正弦函數 sin() 就在核心裡面。 還有許許多多的函式,是用核心所提供的基本函式與保留字寫成的外部函式, 通常分門別類被集結在「組件」裡面。 Matlab 組件成為「工具箱」Toolbox,各有一個名稱。 其中只有 Matlab 工具箱是隨著 Matlab 套裝軟體一起販售的, Matlab 工具箱裡面包含了核心函式的線上說明文件,例如說

help sin
所看到的簡單說明,就是放在 Matlab Toolbox 裡面。 此外,Matlab Toolbox 還有一些基礎但是次要的函式,例如 quad() 是以辛普森 (Simpson) 數值積分法做數值積分的函式, 就放在 Matlab Toolbox 裡面。

Matlab 的其他 Toolbox 都另外販售,各有各的主題, 例如有訊號分析工具箱 (Signal Processing Toolbox)、 影像處理工具箱 (Image Processing Toolbox)、 統計工具箱 (Statistics Toolbox) 等等。 詳情請自行洽詢 Matlab 經銷商或者 Matlab 本公司的網站。

原則上,每個工具箱都是由一大堆 M-file 組成的, 而這些 M-file 放在檔案夾裡面,一個工具箱對應一個檔案夾。

至於 Matlab 要如何找到那些放在各個檔案夾裡面的 M-file 呢? 就是利用「搜尋路徑」機制。下指令

path
就會看到許多檔案夾的絕對路徑,每一列一個路徑, 就代表 Matlab 會按照這些路徑的順序,從第一個路徑的那個檔案夾開始, 一個一個尋找函式。 如果找到了,就執行,而不會再往下找。 如果全部找不到,就會出現
??? Undefined function or variable 'xxx'.
這樣的錯誤訊息。

那一列接著一列的檔案夾絕對路徑,就是 Matlab 的「搜尋路徑」。 使用者可以修訂、增加、刪除「搜尋路徑」裡面的檔案夾, 也可以更改它們的順序。 但是現在暫時不學這種操作細節。

如果 foo.m 或者 eigshow.m 不在搜尋路徑上, 那麼下指令

foo
或者
eigshow
就會得到錯誤訊息 (注意,下指令的時候只寫 M-file 的名字,不寫副檔名)。 解決方案有三,以下只說 foo.m,讀者應該知道, 換成 eigshow.m 也是一樣的。
  1. 修改搜尋路徑,使得它包含 foo.m 所在的檔案夾
  2. foo.m 存放在已經列在搜尋路徑之上的檔案夾內
  3. foo.m 所在的檔案夾設定為『目前工作的檔案夾』
前兩個方案都牽涉到搜尋路徑的修訂,暫且不談。 就簡單的腳本程式而言,第三方案是最方便的了。 只要把 M-file 所在的檔案夾設定為『目前工作的檔案夾』, 不管那個檔案夾有沒有在搜尋路徑上,Matlab 都找得到。

下指令

pwd
(意思是 present working directory) 可以檢查『目前工作的檔案夾』的絕對路徑。 然後用 cd 指令,就像 Unix 的 cd 指令一樣 (意思是 change directory) 可以更換『目前工作的檔案夾』。 cd 後面寫著一個絕對路徑或者相對路徑, 就可以更換檔案夾。

如果 Matlab 是在自己的視窗介面內執行, 會看到視窗上方靠右邊,有一個 Current Directory 標題, 再右邊的方框內顯示著『目前工作的檔案夾』, 也就是 pwd 指令告訴您的檔案夾。 按方框右邊的向下箭頭,可以在您過去設定過的檔案夾之中指定一個當作 『目前工作的檔案夾』。 按方框右邊的 ... 按鈕,會開啟一個檔案管理視窗, 在那裡可以指定一個『目前工作的檔案夾』。

請將『目前工作的檔案夾』設定到 foo.m 所在的檔案夾, 然後執行

foo
看看計算結果,或者執行
eigshow
看看 Matlab 可以辦到怎樣的圖形操作介面,將來您如果學得夠多, 也可以寫出這樣的程式。如果是理工學科的學生, 還可以藉此學習關於 eigenvalue/eigenvector 和 singular value 的概念。

現在,您可以利用 [for 和 if] 那一節講解的程式技巧, 將以下習題寫成腳本程式來執行。

習題

  1. 考慮以下程式:
    x = 1;
    for k=1:N,
        x = x + 2^(-k);
        if (abs(x-2) <= err),
            break;
        end
    end
    如果我想知道,需要做幾項級數的部份和,才能使得誤差不大於 10-12, 您會設定 N 是多少?err 是多少?而究竟需要幾項呢?
  2. 找到最小的正整數 k 使得
    \begin{displaymath}
\vert 1 + \frac1{2^2} + \frac1{3^2} + \cdots + \frac1{k^2} - \frac{\pi^2}6 \vert
\leq 3\times 10^{-5} \end{displaymath}

  3. 找到最小的正整數 k 使得
    \begin{displaymath}
\vert 1 + \frac1{2^4} + \frac1{3^4} + \cdots + \frac1{k^4} - \frac{\pi^4}{90} \vert
\leq 5\times 10^{-12} \end{displaymath}

  4. 找到最小的正整數 k 使得
    \begin{displaymath}
\vert 1 - \frac13 + \frac15 - \frac17 + \frac19 \cdots + \frac1{4k+1} - \frac\pi{4} \vert
\leq 5\times 10^{-10}\end{displaymath}

  5. 找到最小的正整數 k 使得
    \begin{displaymath}
\vert 1 - \frac12 + \frac13 - \frac14 + \frac15 \cdots + \frac1{2k+1} - \ln 2\vert
\leq 5\times 10^{-6} \end{displaymath}

單維彰 (2004/04/28) --- [Prev] [Next] [Up]