1. 程式人生 > >【matlab】MATLAB程式流程控制

【matlab】MATLAB程式流程控制

專題三    MATLAB程式流程控制

一    順序結構程式

程式的三種基本結構:順序結構、選擇結構、迴圈結構。

程式檔案分為指令碼檔案和函式檔案。指令碼檔案是可以在命令列視窗直接執行的檔案,也叫作命令檔案;函式檔案是定義一個函式,不能直接執行,而必須以函式呼叫的方式來呼叫它。

1. 程式檔案的建立

  • 用命令按鈕建立程式檔案

  • 用edit命令建立

舉例。

2. 順序結構

(1) 資料的輸入

呼叫格式為 A=input(提示資訊, 選項)

(2) 資料的輸出

呼叫格式為 disp(輸出項)

(3) 程式的暫停

呼叫格式為  pause(延遲秒數)

如果省略引數延遲秒數,則程式暫停,直到使用者按任意鍵結束暫停。

若要強行中止程式的執行,可使用ctrl+c命令。

-----------------------------------------------------------------------------------

二    用if語句實現選擇結構

        選擇結構又稱為分支結構,是根據給定的條件是否成立來決定程式的執行流程。

1. 單分支if語句

語句格式:

條件一般用關係運算或者邏輯運算來表示,結果是一個標量或者矩陣。語句組可以是一條語句,也可以是多條語句。

  • 當條件結果為標量時,非零表示條件成立,零表示條件不成立。
  • 當條件結果為矩陣時,如果矩陣是非空矩陣,且不包含零元素,則條件成立,否則條件不成立。

例如:矩陣[1,2; 0,4]表示條件時,條件不成立;[1,2; 3,4]表示條件時,條件成立。

2. 雙分支if語句

語法格式:

舉例:輸入一個整數,若為奇數則輸出其平方根,否則輸出其立方根。

clear all; clc; 
x = input('Please input a number:'); 
if rem(x,2) == 1
    s = sqrt(x);
else
    s = x ^ (1/3);
end
disp(s); 

上述程式中,rem(x,2)==0可以寫成~(rem(x,2)),x^(1/3)可以寫成power(x,1/3)。

3. 多分支if語句

語法格式:

           

舉例:輸入一個字元。若為大寫字母,則輸出其對應的小寫字母;若為小寫字母,則輸出其對應的大寫字母;若為數字字元,則輸出其對應數的平方;若為其他字元,則原樣輸出。

方法一:

clear all; clc; 
ch = input('請輸入一個字元:','s');
if length(ch) ~= 1
   error('必須輸入一個字元'); 
end
if (ch >= 'A' && ch <= 'Z')
    ch = char(ch - ('A'-'a')); 
elseif (ch >= 'a' && ch <= 'z')
    ch = char(ch - ('a'-'A')); 
elseif (ch >= '0' && ch <= '9')
    ch = (str2double(ch))^2; 
else
    ch = ch; 
end
disp(ch);

方法二:   

clear all; clc; 
ch = input('請輸入一個字元:','s');
if length(ch) ~= 1
   error('必須輸入一個字元'); 
end
if (ch >= 'A' && ch <= 'Z')
    disp(lower(ch));  
elseif (ch >= 'a' && ch <= 'z')
    disp(upper(ch)); 
elseif (ch >= '0' && ch <= '9')
    disp((str2double(ch))^2); 
else
    disp(ch); 
end 

這裡的函式lower()將大寫字母轉換為小寫字母,函式upper()將小寫字母轉換為大寫字母,函式str2double()將字元轉換為相應的數字。

-----------------------------------------------------------------------------------

三    用switch語句實現選擇結構

語法格式:

switch表示式應該是一個其值可以列舉的表示式。case結果表為switch表示式的取值,當取值有多個時,用單元資料表示。

舉例:輸入一個英文單詞,判斷其是否以母音字母開頭。

方法一:

clear all; clc; 
c = input('Please input a word: ', 's'); 
switch c(1)
    case {'A','E','I','O','U','a','e','i','o','u'}
        disp([c, '以母音開頭']);
    otherwise
        disp([c, '以子音開頭']);
end

方法二:

clear all; clc; 
c = input('Please input a word: ', 's'); 
if findstr(c(1), 'AEIOUaeiou') > 0
    disp([c, '以母音開頭']);
else
    disp([c, '以子音開頭']);
end

-----------------------------------------------------------------------------------

四    用for語句實現迴圈結構

        迴圈結構又稱為重複結構,是利用計算機運算速度快以及能進行邏輯控制的特點來重複執行某些操作。

語法格式:

表示式1為初值,表示式2為步長,表示式3為終值。三者生成一個行向量。

說明:

  • for語句針對向量的每一個元素執行一次迴圈體。向量有多少個元素,for語句就執行多少次迴圈體語句。
  • 退出迴圈後,迴圈變數的值就是向量的最後一個元素值。
  • 當向量為空時,迴圈體一次也不會執行。例如:k=1:-1:10就是一個空向量

-----------------------------------------------------------------------------------

五    用while語句實現迴圈結構

while語句

舉例:從鍵盤輸入若干個數,當輸入0時結束輸入,求這些數的平均值和它們的和。

clear all; clc; 
m = input('輸入一個數字:'); 
if isempty(m)
   error('請輸入一個數字'); 
end
if (m == 0)
   error('第一個數字不要輸入0'); 
end
sum = 0; 
k = 1; 
while m ~= 0
    sum = sum + m; 
    avg = sum / k;
    m = input('輸入一個數字:'); 
    k = k + 1; 
end
disp(['這些數的平均值是:', num2str(avg)]);
disp(['這些數的和是:', num2str(sum)]); 

說明:

  • while語句多用於迴圈次數不確定的情況,而對於迴圈次數確定的情況,使用for語句更方便。
  • 針對不同情況可以選擇不同的迴圈語句,但從功能上講兩種迴圈語句可以相互替代。

bread語句和continue語句

  • break語句用來跳出迴圈體,結束整個迴圈。
  • continue語句用來結束本次迴圈,接著進行下一次是否執行迴圈的判斷。

舉例:求[100, 200]之間第一個能被21整除的整數。

方法一:

clear; clc; 
for n = 100 : 200
   if rem(n, 21) == 0
      disp(['[100,200]之間第一個能被21整除的整數是',num2str(n)]);
      break; 
   end
end

方法二:

clear; clc; 
for n = 100 : 200
   if rem(n, 21) ~= 0
        continue; 
   end
   disp(['[100,200]之間第一個能被21整除的整數是',num2str(n)]);
   break; 
end

迴圈的巢狀

        如果一個迴圈結構的迴圈體又包含一個迴圈結構,就稱為迴圈的巢狀,或稱為多重迴圈結構。

-----------------------------------------------------------------------------------

六    函式檔案的定義與呼叫

函式檔案的定義

function 輸出形參表=函式名(輸入形參表)

註釋說明部分

函式體語句

當有多個形參時,形參之間用逗號分隔,組成形參表。當輸出形參多於一個時,用方括號括起來,構成一個輸出矩陣。

  • 函式檔名通常由函式名再加上副檔名.m組成,函式檔名與函式名也可以不相同。當函式檔名與函式名不相同時,MATLAB將忽略函式名,呼叫該函式時使用函式檔名。建議函式檔名與函式名一致。
  • return語句表示結束函式的執行。通常也可以不使用return語句。

函式檔案的呼叫

呼叫格式:

[輸出實參表] = 函式名(輸入實參表)

在函式呼叫時,函式輸入輸出引數稱為實際引數,簡稱實參。輸入輸出的實參應當與函式定義時的形參個數、順序一致。函式呼叫時,先將實參傳遞給相應的形參,從而實現引數傳遞,然後再執行函式的功能。

匿名函式

        除了通過函式檔案定義一個函式以外,MATLAB還可以使用一種特殊形式的函式,即匿名函式。匿名函式的基本格式如下:

函式控制代碼變數 = @(匿名函式輸入引數)匿名函式表示式

函式控制代碼變數相當於這個匿名函式的別名。利用函式控制代碼可以間接地呼叫這個函式,@是建立函式控制代碼的運算子,

舉例。建立一個函式,該函式的表示式為x²+y²,並求x=3, y=4時的函式值。

除了可以給自定義的函式表示式建立函式控制代碼以外,還可以給已存在的函式建立函式控制代碼。格式如下:

函式控制代碼變數 = @函式名

這些已存在的函式包括內部函式和自定義函式(即自己寫的函式檔案)。

-----------------------------------------------------------------------------------

七    函式的遞迴呼叫

        在介紹函式的遞迴呼叫之前,先了解函式的巢狀呼叫。如果在一個函式的定義中,呼叫了其他函式,這就是函式的巢狀呼叫。

        一個函式呼叫它自身稱為函式的遞迴呼叫。比如:在定義函式fact()時呼叫了函式fact()本身。

function f = fact(n)
...
    fact(n-1);
...

        遞迴的意思是:把一個大型複雜的問題層層轉化為一個與原問題相似的、規模較小的問題來求解。遞迴策略只需要少量的程式就可以描述出解題過程所需要的多次重複計算,大大減少了程式的程式碼量,但遞迴方法會加大儲存空間和計算時間上的耗費,影響程式的執行效率。函式的遞迴呼叫有兩種形式,一種是直接遞迴呼叫,一種是間接遞迴呼叫。

        直接遞迴呼叫是在定義函式時直接呼叫這個函式本身,間接遞迴呼叫是通過巢狀呼叫其他函式,在其他函式中又呼叫這個函式本身來實現的。

        包含遞迴呼叫的函式稱為遞迴函式。

舉例:利用函式的遞迴呼叫,求n!。

clear; clc; 
n = input('Please input n = ');
s = factorial(n);
disp(s); 

function s = factorial(n)
if n <= 1
    s = 1; 
else
    s = factorial(n-1)*n;
end
end

-----------------------------------------------------------------------------------

八    函式引數與變數的作用域

函式引數的可調性

        MATLAB在函式呼叫上有一個特點,就是函式所傳遞的引數數目是可調的,由於這個特點,同一個函式就可以完成多種功能。在呼叫函式時,MATLAB有兩個預定義變數,nargin和nargout。nargin記錄呼叫這個函式時輸入實參的個數,nargout記錄呼叫這個函式時輸出實參的個數。

clear; clc; 
f1 = fout(10);
disp(f1);
f2 = fout(10, 10);
disp(f2);
f3 = fout(10, 10, 10);
disp(f3);

%%
function f = fout(a,b,c)
    if nargin == 1
        f = a;
    elseif nargin == 2
        f = a + b;
    elseif nargin == 3
        f = (a * b * c) / 3;
    end
end

全域性變數和區域性變數

  • 區域性變數是指程式中只在特定過程或函式中可以訪問的變數。
  • 全域性變數的作用域是整個MATLAB工作空間,也就是全程有效,所有的函式都可以對它進行存取或修改。

全域性變數的定義格式:

        global  變數名

舉例。

如果要使用全域性變數,在函式檔案中必須予以宣告,並且全域性變數之間用空格分隔。在函式檔案中聲明瞭全域性變數之後,命令列視窗中可以不再宣告該全域性變數,也可以再次宣告該全域性變數。

        可以在所有需要呼叫全域性變數的函式檔案中定義全域性變數。如果要在工作空間中使用全域性變數,也要在工作空間中定義全域性變數。