Matlab入門教程--流程控制

 
 Matlab入門教程--流程控制 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,而不再呼叫此函數本身。
發信人: alphazhao (子羽 & 三笑), 信區: Modelling
標 題: Matlab入門 (3)
發信站: 武漢白雲黃鶴站 (Fri Dec 10 14:41:49 1999), 站內信件
 
發信人: Mars (混沌·分形·週期三), 信區: MATH
標 題: Matlab入門教程--流程控制
發信站: 一網深情 (Sun Nov 29 17:35:36 1998), 轉信
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,而不再呼叫此函數本身
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章