1-2、重復命令??
最簡單的重復命令是for?圈(for-loop),其基本形式為:????
for 變數 = 矩陣;???
運算式;???
end??
其中變數的值會被依次設定為矩陣的每一行,來執行介於for和end之間的運算式。因此,若無意外情況,運算式執行的次數會等於矩陣的行數。??
舉例來說,下列命令會產生一個長度為6的調和數列(Harmonic sequence):?
x = zeros(1,6); % x是一個16的零矩陣??
for i = 1:6,??
x(i) = 1/i;??
end ???
在上例中,矩陣x最初是一個16的零矩陣,在for?圈中,變數i的值依次是1到6,因此矩陣x的第i個元素的值依次被設為1/i。我們可用分數來顯示此數列:???
format rat % 使用分數來表示數值??
disp(x)??
1 1/2 1/3 1/4 1/5 1/6??
for圈可以是多層的,下例產生一個16的Hilbert矩陣h,其中為於第i列、第j行的元素為???
h = zeros(6);??
for i = 1:6,??
for j = 1:6,??
h(i,j) = 1/(i+j-1);???
end???
end???
disp(h)???
1 1/2 1/3 1/4 1/5 1/6??
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矩陣的每一行的平方和:???
for i = h,??
disp(norm(i)^2); % 印出每一行的平方和??
end??
?
1299/871??
282/551???
650/2343??
524/2933??
559/4431??
831/8801??
在上例中,每一次i的值就是矩陣h的一行,所以寫出來的命令特別簡潔。??
令一個常用到的重復命令是while?圈,其基本形式為:??
while 條件式;??
運算式;??
end?
也就是說,只要條件示成立,運算式就會一再被執行。例如先前產生調和數列的例子,我們可用while?圈改寫如下:???
x = zeros(1,6); % x是一個16的零矩陣??
i = 1;??
while i <= 6,???
x(i) = 1/i;???
i = i+1;???
end??
format short
??
1-3、邏輯命令??
最簡單的邏輯命令是if, ..., end,其基本形式為:?
if 條件式;???
運算式;???
end???
if rand(1,1) > 0.5,???
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,即可執行其所包含的命令:??
pwd % 顯示現在的目錄??
ans =???
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');??
test % 執行test.m ??
Start of test.m!??
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則是此函數用到的暫時變數。要使用此函數,直接鍵入函數名及適當輸入引數值即可:??
y = fact(5)??
y = 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即可:?
path???
MATLABPATH??
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\blocks??
d:\matlab5\toolbox\simulink\simdemos???
d:\matlab5\toolbox\simulink\dee??
d:\matlab5\toolbox\local??
此搜尋路徑會依已安裝的工具箱(Toolboxes)不同而有所不同。要查詢某一命令是在搜尋路徑的何處,可用which命令:???
which expo??
d:\matlab5\toolbox\matlab\demos\expo.m??
很顯然c:\data\mlbook并不在MATLAB的搜尋路徑中,因此MATLAB找不到test.m這個M檔案:??
which test??
c:\data\mlbook\test.m??
要將d:\mlbook加入MATLAB的搜尋路徑,還是使用path命令:??
path(path, 'c:\data\mlbook');???
此時d:\mlbook已加入MATLAB搜尋路徑(鍵入path試看看),因此MATLAB已經"看"得到
test.m:??
which test??
c:\data\mlbook\test.m??
現在我們就可以直接鍵入test,而不必先進入test.m所在的目錄。??
小提示:如何在其啟動MATLAB時,自動設定所需的搜尋路徑?如果在每一次啟動MATLAB後都要設定所需的搜尋路徑,將是一件很麻煩的事。有兩種方法,可以使MATLAB啟動後,即可載入使用者定義的搜尋路徑:??
1.MATLAB的預設搜尋路徑是定義在matlabrc.m(在c:\matlab之下,或是其他安裝MATLAB 的主目錄下),MATLAB每次啟動後,即自動執行此檔案。因此你可以直接修改matlabrc.m ,以加入新的目錄於搜尋路徑之中。??
2.MATLAB在執行matlabrc.m時,同時也會在預設搜尋路徑中尋找startup.m,若此檔案存在,則執行其所含的命令。因此我們可將所有在MATLAB啟動時必須執行的命令(包含更改搜尋路徑的命令),放在此檔案中。??
每次MATLAB遇到一個命令(例如test)時,其處置程序為:??
1.將test視為使用者定義的變數。
2.若test不是使用者定義的變數,將其視為永久常數。
3.若test不是永久常數,檢查其是否為目前工作目錄下的M檔案。
4.若不是,則由搜尋路徑尋找是否有test.m的檔案。
5.若在搜尋路徑中找不到,則MATLAB會發出嗶嗶聲并印出錯誤訊息。??
以下介紹與MATLAB搜尋路徑相關的各項命令。??
?
?1-6、資料的儲存與載入??
有些計算曠日廢時,那麼我們通常希望能將計算所得的儲存在檔案中,以便將來可進行其他處理。MATLAB儲存變數的基本命令是save,在不加任何選項(Options)時,save會將變數以二進制(Binary)的方式儲存至副檔名為mat的檔案,如下述:??
save:將工作空間的所有變數儲存到名為matlab.mat的二進制檔案。
save filename:將工作空間的所有變數儲存到名為filename.mat的二進制檔案。 save filename x y z :將變數x、y、z儲存到名為filename.mat的二進制檔案。??
以下為使用save命令的一個簡例:??
who % 列出工作空間的變數??
Your variables are:?
B h j y??
ans i x z??
save test B y % 將變數B與y儲存至test.mat??
dir % 列出現在目錄中的檔案??
. 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??
delete test.mat % 刪除test.mat??
以二進制的方式儲存變數,通常檔案會比較小,而且在載入時速度較快,但是就無法用普通的文書軟體(例如pe2或記事本)看到檔案內容。若想看到檔案內容,則必須加上-ascii選項,詳見下述:??
save filename x -ascii:將變數x以八位數存到名為filename的ASCII檔案。
Save filename x -ascii -double:將變數x以十六位數存到名為filename的ASCII檔案。??
另一個選項是-tab,可將同一列相鄰的數目以定位鍵(Tab)隔開。??
小提示:二進制和ASCII檔案的比較在save命令使用-ascii選項後,會有下列現象:save命令就不會在檔案名稱後加上mat的副檔名。
因此以副檔名mat結尾的檔案通常是MATLAB的二進位資料檔。
若非有特殊需要,我們應該盡量以二進制方式儲存資料。???
load命令可將檔案載入以取得儲存之變數:??
load filename:load會尋找名稱為filename.mat的檔案,并以二進制格式載入。若找不到filename.mat,則尋找名稱為filename的檔案,并以ASCII格式載入。load filename -ascii:load會尋找名稱為filename的檔案,并以ASCII格式載入。??
若以ASCII格式載入,則變數名稱即為檔案名稱(但不包含副檔名)。若以二進制載入,則可保留原有的變數名稱,如下例:??
clear all; % 清除工作空間中的變數??
x = 1:10;??
save testfile.dat x -ascii % 將x以ASCII格式存至名為testfile.dat的檔案??
load testfile.dat % 載入testfile.dat??
who % 列出工作空間中的變數??
Your variables are:?
testfile x??
注意在上述過程中,由於是以ASCII格式儲存與載入,所以產生了一個與檔案名稱相同的變數testfile,此變數的值和原變數x完全相同。??
?
1-7、結束MATLAB??
有三種方法可以結束MATLAB:??
1.鍵入exit
2.鍵入quit
3.直接關閉MATLAB的命令視窗(Command window)??
評論
查看更多