Matlab 導引:檔案與路徑

Matlab 與檔案系統的關係,就如同文字操作介面一樣, 有 工作區 (current directory) 與可執行檔的 搜尋路徑 (path) 這些概念。 在 Matlab 中下指令 cd (current directory) 或 pwd (present working directory) 都會看到 Matlab 目前設定的工作區。 若在 cd 指令之後跟著寫檔案系統的相對或絕對檔案夾路徑名稱, 就會將工作區設定到那個檔案夾去。 至少目前就我所知,Matlab 尚未能正確接受中文檔名。 如果檔案名稱中含有空格,要用單引號將它括起來。 例如,在我的個人電腦裡面,原本的工作區在 C:\Matlab\bin,但是我將它改到 C:\My Documents 去 (通常在桌面上看到的資料夾名稱是【我的文件夾】)。
>> cd
C:\MATLAB\bin
>> cd 'C:\My Documents'
>> cd
C:\My Documents

指令 lsdir 都會列出工作區中的所有檔案。 而 what 只會列出 Matlab 認得的檔案,它們包括 M 檔案、MAT 檔案和 MEX 檔案。 所謂 M 檔案,就是副檔名為 M 的檔案;MAT 與 MEX 亦同。

如果在前述指令之後指定一個檔案夾,則 Matlab 會列出那個檔案夾裡面的檔案。

每當我們要求 Matlab 讀或寫任何檔案的時候,它都在工作區中讀或寫。 除非在指令中額外規定檔案的路徑。 有關 Matlab 所讀寫的檔案,請看 輸出輸入 篇。

Matlab 的指令有一小部份由特殊符號組成,例如 + - * / \ ' ^ 和它們的逐項版本 (pointwise version)。 遇到這些符號的時候,Matlab 該做什麼,已經寫在 Matlab 的核心程式 (kernel) 裡面, 這是一個有 MathWorks 公司出售的可執行檔,以我的 PC 為例,這個檔案是

C:\Matlab\bin\matlab.exe
這是個用 C 寫成的軟體,我們通常看不到它的原始碼。 所有這些寫在核心程式裡面的指令,稱為 內建指令 (built-in commands)。

除了符號以外,其他的 Matlab 指令都以英文字串的形式出現。 這些字串就是 Matlab 的指令名。 指令的命名規則與變數的命名規則相同,請參考 變數 篇。 而 Matlab 的指令有分以下四種形式:

前兩者看不到原始碼,後兩者可以。

當 Matlab 拿到一個字串,它的解讀規則如下:

  1. 與工作環境中的變數名相比對,如果成功了就當它是變數。
  2. 與內建指令的函式名相比對,如果成功了就當它是一個內建指令。
  3. 與工作區內所有的 MEX 檔案相比對,如果成功了就執行這個外援程式。
  4. 與工作區內所有的 M 檔案相比對,如果成功了就執行這個腳本程式或函式。
  5. 取得目前設定的搜尋路徑。

所謂搜尋路徑是一個序列的檔案夾,按照記錄的先後順序排序。 用指令 path 看到目前設定的路徑。 通常我們不需要刪改這個內定的路徑,只需要增添新的檔案夾進去。 例如想要增添 C:\My Documents\Matlab 進入路徑,說
>> path('c:\my documents\matlab', path)
將此檔案夾加在目前路徑的前面,而
>> path(path, 'c:\my documents\matlab')
將此檔案夾加在目前路徑的後面。

當 Matlab 取得了路徑之後,就

  1. 依序進入路徑上面的檔案夾
  2. 接受第一個找到的檔案來執行。
  3. 如果都沒找到,就說
    ??? Undefined function or variable
    

那要怎樣知道一個字串是變數呢?還是內建指令?還是某個程式或函式呢? 用 which 指令來問。例如
>> which inv
inv is a built-in function.
>> which which
which is a built-in function.
>> which tic
c:\matlab\toolbox\matlab\timefun\tic.m
>> which ans
ans is a variable.
我們得知 which 和 inv 都是內建指令,tic 是一個 M 檔案,ans 是一個變數。 凡是 M 檔案都是純文字原始碼,可以打開來觀摩看看那個程式是怎麼寫的。

萬一有同名的指令呢?按照上面的規則,如果有同名的變數或指令, 則優先被認定為變數,其次是內建指令,依此類推。 由此可見,似乎優先權比較低的指令永無出頭之日。其實不然。 這種情況很少發生,我們只簡述一個例子。 看 help inv,得知還有其他同名的指令 (overloaded methods) sym/inv、ss/inv 等等。 用 which sym/inv 看看它是哪個程式, 再用 help sym/inv 看看它是做什麼的?



[ 上一單元 ]    [ 下一單元 ]    [ 上層目錄 ]

單維彰
中央大學數學系
桃園,中壢 320
shann@math.ncu.edu.tw
(C) Copyright 2000 Wei-Chang Shann 單維彰
建立:2000/01/09‧修改:2000/01/09