Matlab 導引:腳本程式

當我們在 Matlab 的環境內下指令,每輸入一句指令,按了 Enter 之後 Matlab 就開始執行; 我們要等待它執行結束之後才能輸入下一個指令,然後按 Enter 叫它執行。 這種一個指令、一個動作的操作模式稱為 互動模式 (interactive mode)。 我們也可以將一批想要 Matlab 執行的指令, 寫在 M 檔案內,讓 Matlab 讀取之後就一行緊接著一行的執行。 這種預先設定步驟、叫它照著做的操作模式稱為 批次模式 (batch mode)。 在批次模式中,M 檔案就好像一齣戲的腳本 (script), 而 Matlab 就騎驢看著腳本一句句跟著唱。 所以我們稱這種程式為腳本或腳本程式。

腳本程式必須是個 M 檔案,也就是副檔名為 m 的檔案。 M 檔案裡面寫的是 Matlab 的指令,所以是純文字檔,可以用任何編輯器處理。 只要將一個 M 檔案放在工作區內,或是放在搜尋路徑上的某個檔案夾內, Matlab 就會將它當作指令看待。關於搜尋路徑,請看 檔案與路徑 篇。

以下我們舉兩個例子來示範腳本的用法。

範例一:讀入數據資料

以下是某班級一學期的微積分小考成績,每次考試的滿分是 10 分。 假設這是個純文字檔,檔案名稱是 score.txt。 全班有 50 位同學,一學期有 16 次小考,缺考的以 0 分計。 為了節省版面,我們只列出前後幾人的成績。 完整的檔案在 score.txt
8800001 無名氏  8 10  8 10  8  9  8  6  0  0  7  0  2  0  0  0
8800002 無名氏  8  6  8  5  8  7  5  4  0 10  2  2  2  5  5  0
8800003 無名氏  7 10  8 10 10 10 10  8  5 10  8  4  6 10  5  4
. . .
8800048 無名氏  6  6  6  4  6  9 10  3  0  7  2  2  0  5  2  3
8800049 無名氏  9  6  6  5 10  8  8  9  0  7  5  4  2 10  5  5
8800050 無名氏  5 10  8 10  2  8 10  7  3  4  2  4  4 10  3  0

現在,為了某些原因我們要將上述資料送進 Matlab。 一個簡單的方法就是將 score.txt 稍加編輯,使它成為一個腳本程式。 基本步驟是:

  1. 將 score.txt 抄到 Matlab 的工作區或路徑上的某個檔案夾內, 並將檔案名改為 score.m
  2. 因為 Matlab 不能讀取中文字串,所以要使用編輯器的技巧將中文姓名全部刪除。 如果用【記事本】來做這件事,可能很費力。 但是有許多其他的編輯器可以輕易地達成這個任務。 我們不再贅述這方面的步驟。
  3. 編輯 quiz.m 的第一行和最後一行,使它成為 Matlab 中宣告一個矩陣的指令。如下。
    G = [
    8800001  8 10  8 10  8  9  8  6  0  0  7  0  2  0  0  0
    8800002  8  6  8  5  8  7  5  4  0 10  2  2  2  5  5  0
    8800003  7 10  8 10 10 10 10  8  5 10  8  4  6 10  5  4
    . . .
    8800048  6  6  6  4  6  9 10  3  0  7  2  2  0  5  2  3
    8800049  9  6  6  5 10  8  8  9  0  7  5  4  2 10  5  5
    8800050  5 10  8 10  2  8 10  7  3  4  2  4  4 10  3  0
    ];
    
  4. 執行 Matlab,用 which score 確定指令的來源是正確的。 然後執行 score
  5. 這時候,Matlab 就讀入了一個 50 乘 17 的矩陣 G。 而 G 的第 2 行到第 17 行資料就是 16 次小考的成績。例如
    >> score
    >> whos
      Name        Size           Bytes  Class
        A         50x17           6800  double array
    
    Grand total is 850 elements using 6800 bytes
    
比如說,我要以 16 次小考中最高的 12 次成績當做學期平常成績, 占學期成績的 40%。我可以這樣做:
>> B=G(:,2:17)';
>> B=sort(B);
>> g=round(mean(B(5:16, :))*4);
我可以用類似的方法將期中考與期末考的成績也輸入 Matlab, 並將結果輸出成純文字檔 (例如用 diary 指令或 fprintf 指令), 然後製作成績報表。

當然,上述工作也可以用其他工具軟體完成,例如微軟的試算表 Excel。 我個人認為,如果一切從 0 開始,Excel 比較容易完成這份工作。 如果已經能夠熟練使用編輯器和 Matlab,則上述流程可以更快速的完成工作。 有興趣的讀者可以自己試試看。 (我在寫這份文件的同時,順便結算了這學期微積分課的平常成績。)

範例二:批次執行重複的步驟

r = 2,給定 x0 = 0.1, 我們要執行以下迭代

x n+1 = r xn ( 1 - xn )
100 次,然後輸出 x100 和從 x0x100 的變化測繪圖。 以下是 Matlab 的指令。
>> r=2;
>> x0=0.1;
>> x(1)=x0;
>> for n=1:100, x(n+1) = r * x(n) * (1-x(n)); end;
>> x(101)
ans =
    0.5000
>> plot(x)
>> axis([1 101 -0.2 1.2])

但是我們想要對許多不同的參數 r 和初始值 x0 做同樣步驟的實驗。 則前面的那段 Matlab 指令,每次最多只要修改前兩行, 重新設定 r 或重新設定 x0, 之後的步驟全然不變。 因此,我們可以寫一個 M 檔案,譬如叫 go.m,內容是
x = zeros(1,101);      % 將 x 序列歸零
x(1)=x0;
for n=1:100, x(n+1) = r * x(n) * (1-x(n)); end;
x(101)
plot(x)
axis([1 101 -0.2 1.2])
which go 確定 go 是正確的指令之後,可以執行
>> r=2;
>> x0=0.75;
>> go
ans =
    0.5000
並且看到新的測繪圖形。 我們建議讀者在 2 和 4 之間選擇不同的 r, 在 0 和 1 之間選擇不同的 x0 做些實驗。 是否看到什麼有趣的現象?

在前面的腳本中,我們看到一個註解。 % 是 Matlab 的一個保留字元,在 % 以後 (含) 的所有字元都被 Matlab 忽略。 所以在 % 之後的文字都可以成為註解文字。

每個 M 檔案從第一行開始的連續註解文字,將會自動成為線上手冊 (on-line menual)。 例如,在 go.m 的最前面幾行寫上
% Input r and 0 < x0 < 1
% This program will iterate r*x*(1-x) 100 times
% 注意 r=3 附近的狀況
%
% 單維彰寫於 2000/01/07

x = zeros(1,101);      % 將 x 序列歸零
. . .
則在 Matlab 中可以用 help 看到 go 這個指令的簡單說明, 這個說明將對使用者和您自己都很有用。
>> help go
  Input r and 0 < x0 < 1
  This program will iterate r*x*(1-x) 100 times
  注意 r=3 附近的狀況

  單維彰寫於 2000/01/07
同學們應盡量自己實驗,用編輯器寫出以上的腳本程式。 如果不方便,我們已經寫好了一份 go.m 給大家參考。



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

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