MATLAB應用介紹
台大生物機電系
馮丁樹教授
伍、MATLAB指令表示法
一、一般用法
MATLAB 是一種陳述性之語言,亦就是說你輸入一段陳述之指令,MATLAB 就替你翻譯然後執行,並輸出結果。其基本語法與其他電腦語言相差不遠。最常用的語法是:
變數(variable) = 陳述(expression )
或者前面的等號及變數也不要,直接陳述指令:
>>指令陳述(expression )
指令陳述通常由操作元、函數及變數名稱組成。指令陳述之後即產生一個矩陣,並直接顯示在螢幕上,或指定給設定的變數,以供後續之用。若指定之變數及等號=均省略時(如前面之第二種情況),則MATLAB會自動提供一個變數,其名稱為 “ans” (取”answer”之意) ,將結果放在裡面。故有一點必須小心的是,這個“ans”的變數內容將隨著你下指令的過程而改變。因而最好的方法是你自已指定一個適當的變數名稱。
一個指令陳述通常均以”Enter”鍵結束,表示指令已經下達完成。但有些指令陳述也許會很長,很像老太婆的裹腳布。此時一行也不夠寫怎麼辦?一般的方法是在該行之最後面連點三點或三點以上(如”…”),代表將延續到下一行。當然若指令陳述很短,置於一行實在可惜。有一個方法是在每一陳述後面加一個逗點(“,”)或分號(“;”)。如此就表示有好幾個陳述置於同一行。
在指定變數、函數、指令名稱時,特別注意大小寫,因為MATLAB 對它認定甚為嚴格,故myfirst與MYFIRST是兩個完全不同的名稱。
每次執行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) 後會產生以此向量之項目為對角線項目而其餘為零之方矩陣,下面為x為ans之例子:
>>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 之單獨一個等號 "=" 已作為指令陳述之指定變數之用,故關係式之等於必須使用雙等號"==" ,以茲區別。這些關係可以用邏輯操作元相互聯接:
& 及
| 或
~ 否
若關係值以數值表示,則其真偽值則分別以1或0表示。若應用於矩陣間之關係比較時,矩陣需為同大小,其各項之關係比較最後仍以0或1表示對應之項目,並將結果置於一矩陣中。下面為相關舉例:
數值關係部份:
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 %比較矩陣a與b
ans =
1 1 1
0 1
1
0 0 1
比較矩陣a與b之結果,可以看出相同的項目將以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 %若矩陣A與B相等時要執行之項目
end
若矩陣A與B不相等時要執行之項目則如:
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+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僅能自最內圈跳出圈外。