在MATLAB下進行基本數學運算,只需將運算式直接打入提示號(>>)之後,並按入Enter鍵即可。例如:
4.2000
MATLAB會將運算結果直接存入一變數ans,代表MATLAB運算後的答案(Answer),並顯示其數值於螢幕上。(為簡便起見,在下述各例中,我們不再印出MATLAB的提示號。)
小提示: |
">>"是MATLAB的提示符號(Prompt),但在PC中文視窗系統下,由於編碼方式不同,此提示符號常會消失不見,但這並不會影響到MATLAB的運算結果。 |
我們也可將上述運算式的結果設定給另一個變數x:
42
此時MATLAB會直接顯示x的值。由上例可知,MATLAB認識所有一般常用到的加(+)、減(-)、乘(*)、除(/)的數學運算符號,以及冪次運算(^)。
小提示: |
MATLAB將所有變數均存成double的形式,所以不需經過變數宣告(Variable declaration)。MATLAB同時也會自動進行記憶體的使用和回收,而不必像C語言,必須由使用者一一指定。這些功能使的MATLAB易學易用,使用者可專心致力於撰寫程式,而不必被軟體枝節問題所干擾。 |
若不想讓MATLAB每次都顯示運算結果,只需在運算式最後加上分號(;)即可,如下例:
若要顯示變數y的值,直接鍵入y即可:
>>y
-0.0045
在上例中,sin是正弦函數,exp是指數函數,這些都是MATLAB常用到的數學函數。下表即為MATLAB常用的基本數學函數及三角函數:
小整理:MATLAB常用的基本數學函數 |
abs(x):純量的絕對值或向量的長度 |
angle(z):複數z的相角(Phase angle) |
sqrt(x):開平方 |
real(z):複數z的實部 |
imag(z):複數z的虛部 |
conj(z):複數z的共軛複數 |
round(x):四捨五入至最近整數 |
fix(x):無論正負,捨去小數至最近整數 |
floor(x):地板函數,即捨去正小數至最近整數 |
ceil(x):天花板函數,即加入正小數至最近整數 |
rat(x):將實數x化為分數表示 |
rats(x):將實數x化為多項分數展開 |
sign(x):符號函數 (Signum function)。
當x<0時,sign(x)=-1; 當x=0時,sign(x)=0; 當x>0時,sign(x)=1。 |
rem(x,y):求x除以y的餘數 |
gcd(x,y):整數x和y的最大公因數 |
lcm(x,y):整數x和y的最小公倍數 |
exp(x):自然指數 |
pow2(x):2的指數 |
log(x):以e為底的對數,即自然對數或 |
log2(x):以2為底的對數 |
log10(x):以10為底的對數 |
小整理:MATLAB常用的三角函數 |
sin(x):正弦函數 |
cos(x):餘弦函數 |
tan(x):正切函數 |
asin(x):反正弦函數 |
acos(x):反餘弦函數 |
atan(x):反正切函數 |
atan2(x,y):四象限的反正切函數 |
sinh(x):超越正弦函數 |
cosh(x):超越餘弦函數 |
tanh(x):超越正切函數 |
asinh(x):反超越正弦函數 |
acosh(x):反超越餘弦函數 |
atanh(x):反超越正切函數 |
變數也可用來存放向量或矩陣,並進行各種運算,如下例的列向量(Row
vector)運算:
y = 2*x+1
3 7
11 5
小提示:變數命名的規則 |
|
我們可以隨意更改、增加或刪除向量的元素:
3 7
2 5
3 7
2 5 0 10
3 7
2 0 10
在上例中,MATLAB會忽略所有在百分比符號(%)之後的文字,因此百分比之後的文字均可視為程式的註解(Comments)。MATLAB亦可取出向量的一個元素或一部份來做運算:
x(2)*3+y(4) % 取出x的第二個元素和y的第四個元素來做運算
9
6 1
-1
在上例中,2:4代表一個由2、3、4組成的向量,同樣的方法可用於產生公差為1的等差數列:
7 8
9 10 11 12 13 14 15 16
若不希望公差為1,則可將所需公差直接至於4與13之間:
7 10
13 16
事實上,我們可利用linspace來產生任意的等差數列:
x = linspace(4, 10, 6) % 等差數列:首項為4,末項為10,項數為6
4.0000
5.2000 6.4000 7.6000 8.8000 10.0000
若對MATLAB函數用法有疑問,可隨時使用help來尋求線上支援(on-line
help):
LINSPACE Linearly spaced vector.
LINSPACE(x1, x2) generates a row vector of 100 linearly
equally spaced points between x1 and x2.
LINSPACE(x1, x2, N) generates N points between x1 and x2.
See also
LOGSPACE, :.
小整理:MATLAB的查詢命令 |
help:用來查詢已知命令的用法。例如已知inv是用來計算反矩陣,鍵入help inv即可得知有關inv命令的用法。(鍵入help help則顯示help的用法,請試看看!) |
lookfor:用來尋找未知的命令。例如要尋找計算反矩陣的命令,可鍵入lookfor inverse,MATLAB即會列出所有和關鍵字inverse相關的指令。找到所需的命令後,即可用help進一步找出其用法。(lookfor事實上是對所有在搜尋路徑下的M檔案進行關鍵字對第一註解行的比對,詳見後敘。) |
將列向量轉置(Transpose)後,即可得到行向量(Column vector):
4.0000
5.2000
6.4000
7.6000
8.8000
10.0000
不論是行向量或列向量,我們均可用相同的函數找出其元素個數、最大值、最小值等:
6
10
4
小整理:適用於向量的常用函數有: |
min(x): 向量x的元素的最小值 |
max(x): 向量x的元素的最大值 |
mean(x): 向量x的元素的平均值 |
median(x): 向量x的元素的中位數 |
std(x): 向量x的元素的標準差 |
diff(x): 向量x的相鄰元素的差 |
sort(x): 對向量x的元素進行排序(Sorting) |
length(x): 向量x的元素個數 |
norm(x): 向量x的歐氏(Euclidean)長度 |
sum(x): 向量x的元素總和 |
prod(x): 向量x的元素總乘積 |
cumsum(x): 向量x的累計元素總和 |
cumprod(x): 向量x的累計元素總乘積 |
dot(x, y): 向量x和y的內積 |
cross(x, y): 向量x和y的外積 |
(大部份的向量函數也可適用於矩陣,詳見下述。) |
若要輸入矩陣,則必須在每一列結尾加上分號(;),如下例:
A = [1 2 3 4; 5 6 7 8; 9 10 11 12];
A
1 2 3 4
5 6 7 8
9 10
11 12
同樣地,我們可以對矩陣進行各種處理:
1 2 3 4
5 6 5 8
9 10
11 12
5 6
5
1 2 3 4 5
5 6 5 8 6
9 10
11 12 5
1 3 4 5
5 5 8 6
9 11
12 5
1 3 4 5
5 5 8 6
9 11 12 5
4 3
2 1
A([1 4], :) = [] % 刪除第一和第四列(:代表所有行)
5 5 8 6
9 11
12 5
這幾種矩陣處理的方式可以相互疊代運用,產生各種意想不到的效果,就看各位的巧思和創意。
小提示: |
在MATLAB的內部資料結構中,每一個矩陣都是一個以行為主(Column-oriented)的陣列(Array)因此對於矩陣元素的存取,我們可用一維或二維的索引(Index)來定址。舉例來說,在上述矩陣A中,位於第二列、第三行的元素可寫為A(2,3) (二維索引)或A(6)(一維索引,即將所有直行進行堆疊後的第六個元素)。 |
此外,若要重新安排矩陣的形狀,可用reshape命令:
B = reshape(A, 4, 2) % 4是新矩陣的列數,2是新矩陣的行數
5 8
9 12
5 6
11 5
小提示: |
A(:)就是將矩陣A每一列堆疊起來,成為一個行向量,而這也是MATLAB變數的內部儲存方式。以前例而言,reshape(A, 8, 1)和A(:)同樣都會產生一個8x1的矩陣。。 |
MATLAB可在同時執行數個命令,只要以逗號或分號將命令隔開:
x = sin(pi/3); y = x^2; z = y*10,
7.5000
若一個數學運算是太長,可用三個句點將其延伸到下一行:
sin(pi/3);
若要檢視現存於工作空間(Workspace)的變數,可鍵入who:
testfile
x
這些是由使用者定義的變數。若要知道這些變數的詳細資料,可鍵入:
A 2x4 64 double array
B 4x2 64 double array
ans 1x1 8 double array
x 1x1 8 double array
y 1x1 8 double array
z
1x1 8 double array
Grand total
is 20 elements using 160 bytes
使用clear可以刪除工作空間的變數:
A
???
Undefined function or variable 'A'.
另外MATLAB有些永久常數(Permanent
constants),雖然在工作空間中看不
到,但使用者可直接取用,例如:
3.1416
下表即為MATLAB常用到的永久常數。
小整理:MATLAB的永久常數 |
i或j:基本虛數單位(即) |
eps:系統的浮點(Floating-point)精確度 |
inf:無限大, 例如1/0 |
nan或NaN:非數值(Not a number),例如0/0 |
pi:圓周率 p(= 3.1415926...) |
realmax:系統所能表示的最大數值 |
realmin:系統所能表示的最小數值 |
nargin: 函數的輸入引數個數 |
nargin: 函數的輸出引數個數 |
1-2、重複命令
最簡單的重複命令是for迴圈(for-loop),其基本形式為:
for 變數 = 矩陣;
運算式;
end
其中變數的值會被依次設定為矩陣的每一行,來執行介於for和end之間的運算式。因此,若無意外情況,運算式執行的次數會等於矩陣的行數。
舉例來說,下列命令會產生一個長度為6的調和數列(Harmonic
sequence):
for i = 1:6,
x(i) = 1/i;
end
在上例中,矩陣x最初是一個16的零矩陣,在for迴圈中,變數i的值依次是1到6,因此矩陣x的第i個元素的值依次被設為1/i。我們可用分數來顯示此數列:
disp(x)
for迴圈可以是多層的,下例產生一個16的Hilbert矩陣h,其中為於第i列、第j行的元素為:
for i = 1:6,
for j = 1:6,
h(i,j) = 1/(i+j-1);
end
end
disp(h)
1/2 1/3 1/4 1/5 1/6 1/7
1/3 1/4 1/5 1/6 1/7 1/8
1/4 1/5 1/6 1/7 1/8 1/9
1/5 1/6 1/7 1/8 1/9 1/10
1/6
1/7 1/8 1/9 1/10 1/11
小提示:預先配置矩陣 |
在上面的例子,我們使用zeros來預先配置(Allocate)了一個適當大小的矩陣。若不預先配置矩陣,程式仍可執行,但此時MATLAB需要動態地增加(或減小)矩陣的大小,因而降低程式的執行效率。所以在使用一個矩陣時,若能在事前知道其大小,則最好先使用zeros或ones等命令來預先配置所需的記憶體(即矩陣)大小。 |
在下例中,for迴圈列出先前產生的Hilbert矩陣的每一行的平方和:
disp(norm(i)^2); % 印出每一行的平方和
end
282/551
650/2343
524/2933
559/4431
831/8801
在上例中,每一次i的值就是矩陣h的一行,所以寫出來的命令特別簡潔。
令一個常用到的重複命令是while迴圈,其基本形式為:
while 條件式;
運算式;
end
也就是說,只要條件示成立,運算式就會一再被執行。例如先前產生調和數列的例子,我們可用while迴圈改寫如下:
i = 1;
while i <= 6,
x(i) = 1/i;
i = i+1;
end
format short
1-3、邏輯命令
最簡單的邏輯命令是if,
..., end,其基本形式為:
if 條件式;
運算式;
end
disp('Given random number is greater than 0.5.');
end
Given random number is greater than 0.5.
1-4、集合多個命令於一個M檔案
若要一次執行大量的MATLAB命令,可將這些命令存放於一個副檔名為m的檔案,並在MATLAB提示號下鍵入此檔案的主檔名即可。此種包含MATLAB命令的檔案都以m為副檔名,因此通稱M檔案(M-files)。例如一個名為test.m的M檔案,包含一連串的MATLAB命令,那麼只要直接鍵入test,即可執行其所包含的命令:
D:\MATLAB5\bin
cd c:\data\mlbook % 進入test.m所在的目錄
type test.m % 顯示test.m的內容
% This is my first test M-file.
% Roger Jang, March 3, 1997
fprintf('Start of test.m!\n');
for i = 1:3,
fprintf('i = %d ---> i^3 = %d\n', i, i^3);
end
fprintf('End of test.m!\n');
i = 1 ---> i^3 = 1
i = 2 ---> i^3 = 8
i = 3 ---> i^3 = 27
End of test.m!
小提示:第一註解行(H1 help line) |
test.m的前兩行是註解,可以使程式易於瞭解與管理。特別要說明的是,第一註解行通常用來簡短說明此M檔案的功能,以便lookfor能以關鍵字比對的方式來找出此M檔案。舉例來說,test.m的第一註解行包含test這個字,因此如果鍵入lookfor test,MATLAB即可列出所有在第一註解行包含test的M檔案,因而test.m也會被列名在內。 |
嚴格來說,M檔案可再細分為命令集(Scripts)及函數(Functions)。前述的test.m即為命令集,其效用和將命令逐一輸入完全一樣,因此若在命令集可以直接使用工作空間的變數,而且在命令集中設定的變數,也都在工作空間中看得到。函數則需要用到輸入引數(Input
arguments)和輸出引數(Output
arguments)來傳遞資訊,這就像是C語言的函數,或是FORTRAN語言的副程序(Subroutines)。舉例來說,若要計算一個正整數的階乘(Factorial),我們可以寫一個如下的MATLAB函數並將之存檔於fact.m:
function output = fact(n)
% FACT Calculate factorial of a given positive integer.
output = 1;
for i = 1:n,
output = output*i;
end
其中fact是函數名,n是輸入引數,output是輸出引數,而i則是此函數用到的暫時變數。要使用此函數,直接鍵入函數名及適當輸入引數值即可:
120
(當然,在執行fact之前,你必須先進入fact.m所在的目錄。)在執行fact(5)時,MATLAB會跳入一個下層的暫時工作空間(Temperary
workspace),將變數n的值設定為5,然後進行各項函數的內部運算,所有內部運算所產生的變數(包含輸入引數n、暫時變數i,以及輸出引數output)都存在此暫時工作空間中。運算完畢後,MATLAB會將最後輸出引數output的值設定給上層的變數y,並將清除此暫時工作空間及其所含的所有變數。換句話說,在呼叫函數時,你只能經由輸入引數來控制函數的輸入,經由輸出引數來得到函數的輸出,但所有的暫時變數都會隨著函數的結束而消失,你並無法得到它們的值。
小提示:有關階乘函數 |
前面(及後面)用到的階乘函數只是純粹用來說明MATLAB的函數觀念。若實際要計算一個正整數n的階乘(即n!)時,可直接寫成prod(1:n),或是直接呼叫gamma函數:gamma(n-1)。 |
MATLAB的函數也可以是遞迴式的(Recursive),也就是說,一個函數可以呼叫它本身。舉例來說,n!
= n*(n-1)!,因此前面的階乘函數可以改成遞迴式的寫法:
function output = fact(n)
% FACT Calculate factorial of a given positive integer recursively.
if n == 1, % Terminating condition
output = 1;
return;
end
output = n*fact(n-1);
在寫一個遞迴函數時,一定要包含結束條件(Terminating
condition),否則此函數將會一再呼叫自己,永遠不會停止,直到電腦的記憶體被耗盡為止。以上例而言,n==1即滿足結束條件,此時我們直接將output設為1,而不再呼叫此函數本身。
1-5、搜尋路徑
在前一節中,test.m所在的目錄是d:\mlbook。如果不先進入這個目錄,MATLAB就找不到你要執行的M檔案。如果希望MATLAB不論在何處都能執行test.m,那麼就必須將d:\mlbook加入MATLAB的搜尋路徑(Search
path)上。要檢視MATLAB的搜尋路徑,鍵入path即可:
d:\matlab5\toolbox\matlab\general
d:\matlab5\toolbox\matlab\ops
d:\matlab5\toolbox\matlab\lang
d:\matlab5\toolbox\matlab\elmat
d:\matlab5\toolbox\matlab\elfun
d:\matlab5\toolbox\matlab\specfun
d:\matlab5\toolbox\matlab\matfun
d:\matlab5\toolbox\matlab\datafun
d:\matlab5\toolbox\matlab\polyfun
d:\matlab5\toolbox\matlab\funfun
d:\matlab5\toolbox\matlab\sparfun
d:\matlab5\toolbox\matlab\graph2d
d:\matlab5\toolbox\matlab\graph3d
d:\matlab5\toolbox\matlab\specgraph
d:\matlab5\toolbox\matlab\graphics
d:\matlab5\toolbox\matlab\uitools
d:\matlab5\toolbox\matlab\strfun
d:\matlab5\toolbox\matlab\iofun
d:\matlab5\toolbox\matlab\timefun
d:\matlab5\toolbox\matlab\datatypes
d:\matlab5\toolbox\matlab\dde
d:\matlab5\toolbox\matlab\demos
d:\matlab5\toolbox\tour
d:\matlab5\toolbox\simulink\simulink
d:\matlab5\toolbox\simulink\blocks
d:\matlab5\toolbox\simulink\simdemos
d:\matlab5\toolbox\simulink\dee
d:\matlab5\toolbox\local
此搜尋路徑會依已安裝的工具箱(Toolboxes)不同而有所不同。要查詢某一命令是在搜尋路徑的何處,可用which命令:
d:\matlab5\toolbox\matlab\demos\expo.m
很顯然c:\data\mlbook並不在MATLAB的搜尋路徑中,因此MATLAB找不到test.m這個M檔案:
要將d:\mlbook加入MATLAB的搜尋路徑,還是使用path命令:
此時d:\mlbook已加入MATLAB搜尋路徑(鍵入path試看看),因此MATLAB已經"看"得到test.m:
現在我們就可以直接鍵入test,而不必先進入test.m所在的目錄。
小提示:如何在其啟動MATLAB時,自動設定所需的搜尋路徑? |
如果在每一次啟動MATLAB後,都要設定所需的搜尋路徑,將是一件很麻煩的事。有兩種方法,可以使MATLAB啟動後,即可載入使用者定義的搜尋路徑: |
|
|
每次MATLAB遇到一個命令(例如test)時,其處置程序為:
以下介紹與MATLAB搜尋路徑相關的各項命令。
1-6、資料的儲存與載入
有些計算曠日廢時,那麼我們通常希望能將計算所得的儲存在檔案中,以便將來可進行其他處理。MATLAB儲存變數的基本命令是save,在不加任何選項(Options)時,save會將變數以二進制(Binary)的方式儲存至副檔名為mat的檔案,如下述:
以下為使用save命令的一個簡例:
B h j y
ans i x z
save test B y % 將變數B與y儲存至test.mat
. 2plotxy.doc fact.m simulink.doc test.m ~$1basic.doc
.. 3plotxyz.doc first.doc temp.doc test.mat
1basic.doc book.dot go.m template.doc testfile.dat
以二進制的方式儲存變數,通常檔案會比較小,而且在載入時速度較快,但是就無法用普通的文書軟體(例如pe2或記事本)看到檔案內容。若想看到檔案內容,則必
須加上-ascii選項,詳見下述:
另一個選項是-tab,可將同一列相鄰的數目以定位鍵(Tab)隔開。
小提示:二進制和ASCII檔案的比較 |
在save命令使用-ascii選項後,會有下列現象:
|
由上表可知,若非有特殊需要,我們應該盡量以二進制方式儲存資料。
load命令可將檔案載入以取得儲存之變數:
若以ASCII格式載入,則變數名稱即為檔案名稱(但不包含副檔名)。若以二進制載入,則可保留原有的變數名稱,如下例:
x = 1:10;
save testfile.dat x -ascii % 將x以ASCII格式存至名為testfile.dat的檔案
load testfile.dat % 載入testfile.dat
who % 列出工作空間中的變數
testfile
x
注意在上述過程中,由於是以ASCII格式儲存與載入,所以產生了一個與檔案名稱相同的變數testfile,此變數的值和原變數x完全相同。
1-7、結束MATLAB
有三種方法可以結束MATLAB: