伍、MATLAB指令表示法

伍、MATLAB指令表示法

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僅能自最內圈跳出圈外。

相关推荐

凯迪拉克XT6 6座油箱多少升多大,凯迪拉克XT6 6座一箱油能跑多少公里多远
手机停机怎么查话费
365赢多少钱会被限额

手机停机怎么查话费

🗓️ 07-30 👁️ 7581
手机信号放大器多少钱一套
365赢多少钱会被限额

手机信号放大器多少钱一套

🗓️ 08-10 👁️ 2227
老人去世,孙辈“骑棺”的民间风俗,有什么讲究?
BT365软件提现不了

老人去世,孙辈“骑棺”的民间风俗,有什么讲究?

🗓️ 10-27 👁️ 2615
手机如何输入半角数字,全面指南与实用技巧,手机如何输入半角数字和字母
什么是交易以及如何开始?
BT365软件提现不了

什么是交易以及如何开始?

🗓️ 07-28 👁️ 6629