MATLAB應用介紹

 

台大生物機電系   馮丁樹教授


伍、MATLAB指令表示法

一、一般用法

MATLAB 是一種陳述性之語言,亦就是說你輸入一段陳述之指令,MATLAB 就替你翻譯然後執行,並輸出結果。其基本語法與其他電腦語言相差不遠。最常用的語法是:

        變數(variable) = 陳述(expression )

或者前面的等號及變數也不要,直接陳述指令:

        >>指令陳述(expression )

指令陳述通常由操作元、函數及變數名稱組成。指令陳述之後即產生一個矩陣,並直接顯示在螢幕上,或指定給設定的變數,以供後續之用。若指定之變數及等號=均省略時(如前面之第二種情況),則MATLAB會自動提供一個變數,其名稱為 “ans” (”answer”之意) ,將結果放在裡面。故有一點必須小心的是,這個“ans”的變數內容將隨著你下指令的過程而改變。因而最好的方法是你自已指定一個適當的變數名稱。

一個指令陳述通常均以”Enter”鍵結束,表示指令已經下達完成。但有些指令陳述也許會很長,很像老太婆的裹腳布。此時一行也不夠寫怎麼辦?一般的方法是在該行之最後面連點三點或三點以上(”…”),代表將延續到下一行。當然若指令陳述很短,置於一行實在可惜。有一個方法是在每一陳述後面加一個逗點(“,”)或分號(“;”)。如此就表示有好幾個陳述置於同一行。

在指定變數、函數、指令名稱時,特別注意大小寫,因為MATLAB 對它認定甚為嚴格,故myfirstMYFIRST是兩個完全不同的名稱。

每次執行MATLAB時,它均會提供一個工作間(workspace),以記錄你所指定的變數名稱及內容。所以當你玩MATLAB 太過高興時,也許已經製造許多不需要的變數名稱而不自覺。若你的RAM夠大,自無所謂,但若能養成習慣將不要的變數清除,會使MATLAB 的作業顯得更有效率。你可以下清除指令,將某一個指令清除,如:

>>clear myfirst

此時在工作間之myfirst變數將會被倒到垃圾桶去了。如果你只是玩玩,那也無所謂,因為只要你退出MATLAB,所有的變數也將消失無縱。也許你會說,下次再進來時,想使用從前建立的變數時怎麼辦?有的,只要打一個save 指令:

>>save

此時MATLAB會將你現在所建立之變數存在一個叫matlab.mat的檔案,下次你再進入時,利用另一個load指令會自動將其叫進來。

在運算或顯示過程中,若有運算無法停止,或想中輟運行時,可以按CTRL-C 停止,此時會仍停留在MATLAB 的模式內,可以接受下一步的指令。

MATLAB 本身也有內建的常數,例如eps (epsilon)是一個10的負52次方之小數,可以作為反覆運算時比較之用。另外pi之值等於圓周率π,但須用小寫。

二、內建函數矩陣

下面為一些常用之內建函數矩陣:

eye   特性矩陣(identity matrix)
zeros       
值零矩陣
ones    
值一矩陣
diag    
對角線矩陣(diagonal matrix)
triu     
上三角矩陣
tril     
下三角矩陣
rand   
隨機矩陣
hilb    
希伯特矩陣
magic    
魔術方塊矩陣
toeplitz  
參見help toeplitz之解說

例如指令zeros(m,n) 將產生一個m x n 以零為項目之矩陣;而zeros(n) 會產生一個n x n 以零為內容之方矩陣。

>>zeros(2,3)
ans =
     0     0     0
     0     0     0
>>zeros(3)
ans =
     0     0     0
     0     0     0
     0     0     0

對角線矩陣之功能則可由下列例子加以說明。若A為方矩陣,則diag(A)會產生一個行向量包括A對角項目。若某一向量 x diag(x) 後會產生以此向量之項目為對角線項目而其餘為零之方矩陣,下面為xans之例子:

>>A = [1 2 3;4 5 6; 7 8 9]

A =
     1     2     3
     4     5     6
     7     8     9

>>diag(A)
ans =
     1
     5
     9
>>diag(ans)
ans =
     1     0     0
     0     5     0
     0     0     9

一個矩陣亦可由不同的區塊矩陣組成,例如:上述之A[3 x 3]矩陣,加上其他可以組成另一個 [5x5] B矩陣:

>>B = [A, zeros(3,2); zeros(2,3), eye(2)]
B =
     1     2     3     0     0
     4     5     6     0     0
     7     8     9     0     0
     0     0     0     1     0
     0     0     0     0     1

注意矩陣中之”;”表示置於下一列,而”,”表示接續於下一行之意。

三、關係操作元

MATLAB 有如下之關係操作元:

==    等於
~=   
不等於
<     
小於
<=   
小於或等於
>     
大於
>=   
大於或等於

注意MATLAB 之單獨一個等號 "=" 已作為指令陳述之指定變數之用,故關係式之等於必須使用雙等號"==" ,以茲區別。這些關係可以用邏輯操作元相互聯接:

&    
|      

~     

若關係值以數值表示,則其真偽值則分別以10表示。若應用於矩陣間之關係比較時,矩陣需為同大小,其各項之關係比較最後仍以01表示對應之項目,並將結果置於一矩陣中。下面為相關舉例:

數值關係部份:

        3<5  => ans = 1
        3>5  => ans = 0
        3==5        => ans = 0
        3==3        => ans = 1

矩陣關係部份:

>> a=rand(3) %產生一個隨機矩陣a
a =
    0.9501    0.4860    0.4565
    0.2311    0.8913    0.0185
    0.6068    0.7621    0.8214
>>b=triu(a) %
產生矩陣a之上三角部份
b =
    0.9501    0.4860    0.4565
         0    0.8913    0.0185
         0         0    0.8214

>>a==b   %比較矩陣ab
ans =
     1     1     1
     0     1     1
     0     0     1

比較矩陣ab之結果,可以看出相同的項目將以1代表,不同者以0代表,建立另一個判斷的矩陣。

四、條件敘述

條件敘述是一種重要的功能,可以擴大程式判斷的能力。MATLAB最簡單之條件敘述有下面之型式:

if {relation}
     {
指令敘述};
end

若關係為真則執行指令敘述。這種型式幾乎可以在其他程式語言中找到相關型式,例如:

>>   bb=0,aa=rand(1),if aa<=0.5 bb=1, end;  %aa為隨機值,注意每一個敘述中用”,”分開

bb =
     0
aa =
    0.4103
bb =
     1

指令中,if aa<=0.5 bb=1, end;為條件陳述,aa為隨機產生值,因為小於0.5,故bb值設定為1。若是兩個矩陣相比較(大小要相同),其結果矩陣內之項目需同時為非零之值才能為真,否則為偽。因此若兩矩陣相等時要執行的個案例如下:

if A == B
        statement %
若矩陣AB相等時要執行之項目
end

若矩陣AB不相等時要執行之項目則如:

 if A == B else
        statement
end

這與下面應用的意義相同:

if A ~= B
        statement
end

通常If-then-else 之結構在MATLAB中亦可應用,例如:

if {relation 1}
        {statements 1}; %
關係1為真時執行之指令敘述
elseif{relation 2}
        {statements 2}; %
關係2為真時執行之指令敘述
.
.
elseif{relation N}  
        {statements N}; %
關係N為真時執行之指令敘述
else
        {statements}; %
上述關係均為偽時執行之指令敘述
end

五、For 迴圈之應用

MATLAB for 迴圈之型式如下:

for {var} = {row vector or counter values}
        {statements};
end

例如:

>> x=0,for i = 1:5, x(i) = i^2, end; % 先將x矩陣清為零,再進行迴圈
x =
     0
x =
     1
x =
     1     4
x =
     1     4     9
x =
     1     4     9    16
x =
     1     4     9    16    25

由這個迴圈之運作,至少可以看出x列向量之大小逐漸因執行過程而擴大的情形。上述迴圈亦可寫成:

for i = 1:5
x(i) = i^2;
end

若改成遞減的方式亦有同樣的結果:

        for i = 5:-1:1, x(i) = i^2, end

使用這種遞圈的觀念亦很容易產生向量矩陣,例如:

>>x=1:1:10
x =
     1     2     3     4     5     6     7     8     9    10

這表示產生一個序列向量,起始值為1,增量為1,直到10為止。若增量為1個單位時,上述x向量亦可用x=1:10產生。當然增量改為負值時,其順序應相反:

>>x=10:-1:1
x =
    10     9     8     7     6     5     4     3     2     1

六、While 迴圈

MATLAB 亦可使用While 迴圈,其型式如下:

while {relation}
        {statements};
end

茲以計算前N個自然數和之例說明:

N = 50; n = 0; sum = 0; %先設定儲存變數
while n <N,  %
只要n 小於50,下面之指令陳述繼續執行
        n = n+1;
        sum = sum+n;
end

>>sum =
        1275

上面程式執行後,其值應為1275。此小程式中可以得知大寫的N與小寫的n是兩個不相干的變數。故大小寫的變數不能混淆,否則會有很大的麻煩。

七、 SWITCH條件式

與前面之if-else-end 敘述相同的條件式亦可利用SWITCH 之敘述方式有時會更有條理化。SWITCH 之陳述型式如下: 

        SWITCH switch_expr
          CASE case_expr,
            statement, ..., statement
          CASE {case_expr1, case_expr2, case_expr3,...}
            statement, ..., statement
         ...
          OTHERWISE,
            statement, ..., statement
        END

在這裡只要第一個 CASE 的條件相符合時,其後之敘述指令即會被執行。若CASE 之條件是以數個單元之集合表示(如第二個CASE),則只要其中一單元符合SWITCH後之條件,即會執行第二CASE下之指令陳述。若所有條件均不符合,則會執行OTHERWISE後之指令陳述。若上面所設立之條件均不符合時,則什麼都不執行,摸著鼻子就離開了。不論如何,僅其中一個CASE的內容會被執行,執行後即會跳到 END後面之敘述去執行下一段之指令。這種方式可以說是最結構化之條件式,也最常用。

在沒離開這個題目之前,仍有幾句話附帶說明,在SWITCH後面之敘述switch_expr,可以為常數或字串。故只要switch_expr==case_expr 為真,則該CASE下之陳述會被執行。下面為例子:

( METHOD 為一字串變數) 

        switch lower(METHOD) %這裡之lower()函數是將所有字串均化為小寫
          case {'linear','bilinear'}, disp('Method is linear') %
有兩項選擇
          case 'cubic', disp('Method is cubic'), …
          case 'nearest', disp('Method is nearest'), …
          otherwise, disp('Unknown method.')
        end

八、break指令

break這一個指令常與迴圈WHILE FOR 配合使用,可以自迴圈中跳出至下一層之迴圈,在巢狀迴圈中,break僅能自最內圈跳出圈外。