《MATLAB程序設計基礎教程》課件第3章_第1頁
《MATLAB程序設計基礎教程》課件第3章_第2頁
《MATLAB程序設計基礎教程》課件第3章_第3頁
《MATLAB程序設計基礎教程》課件第3章_第4頁
《MATLAB程序設計基礎教程》課件第3章_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第3章MATLAB程序設計3.1概述3.2循環(huán)程序3.3分支結構3.4人機交互語句3.5程序的常見錯誤處理 3.1概述

3.1.1MATLAB程序設計方法

MATLAB程序可以分為兩類:交互式和M文件的編程。

對于一些簡單問題的程序,用戶可以直接在MATLAB的命令窗口中輸入命令,用交互式的方式來編寫。這種方式適用于命令比較簡單,輸入比較方便,同時處理問題的步驟較少的情況。但是,對于較復雜的問題,由于處理所需的命令較多,即需要邏輯運算、需要一個或多個變量重復驗證、需要進行流程控制等,那么此時采用直接輸入命令的方法則會引起不便。為此,MATLAB提供了一個合理的解決方法,就是事先將一系列MATLAB命令輸入到一個文本文件中加以保存,只要執(zhí)行該文件,則文件中所有MATLAB命令都被執(zhí)行,其結果與直接在MATLAB的命令窗口中輸入命令執(zhí)行的結果一樣。由于該文本文件以“.M”為擴展名,因此被稱為M文件。當需要處理重復、復雜且容易出錯的問題時,可以建立一個M文件,進行合理的程序設計,這就是M文件的編程工作方式。3.1.2MATLAB程序結構

MATLAB作為一種常用的編程語言,支持各種決策或流程控制結構。流程控制極其重要,因為它用過去、現(xiàn)在的計算影響將來的結果。MATLAB程序結構分為順序結構、分支結構和循環(huán)結構,具體如圖3-1所示。

由于這些結構經(jīng)常包含大量的MATLAB命令,故經(jīng)常出現(xiàn)在M文件中,而不是直接加在MATLAB提示符下。圖3-1MATLAB程序結構

1.順序結構

順序程序結構是一種最簡單的程序結構,將MATLAB語句按先后次序排列即可。系統(tǒng)在編譯程序時,按照程序的物理位置順序執(zhí)行。這種程序容易編制,但是結構單一,能夠實現(xiàn)的功能有限。例如:

a=1;b=2;c=3;

s1=a+b;

s2=s1+c;

s3=s2/s2;

2.分支結構

程序在運行過程中要根據(jù)不同的情況或條件作出判斷,并依據(jù)判斷的結果轉向相應的處理程序,這種程序結構稱為分支結構。

分支是通過條件轉移指令實現(xiàn)的,進行分支結構程序設計之前,應首先確定要判斷的是什么條件,以及當判斷結果為不同的情況(“真”或“假”)時應該執(zhí)行什么樣的操作。MATLAB提供條件轉移的if…end分支程序結構。

有的分支結構為多分支,可依次測試各個條件是否滿足。若滿足條件則轉入相應分支入口,若不滿足則繼續(xù)向下測試,直到全部測試完。分支選擇程序結構簡單、直觀,但執(zhí)行速度慢。MATLAB提供條件轉移的switch開關分支程序結構。

分支結構程序設計需要使用關系運算、邏輯運算、條件運算等。

3.循環(huán)結構程序設計

在日常的實際生活中,會經(jīng)常用到“循環(huán)結構”,例如數(shù)據(jù)的累加計算等,但又與順序結構和選擇結構不同,無論是順序還是選擇分支語句,它們中的每一條語句一般只執(zhí)行一次。而循環(huán)結構中,有時常要重復某幾條語句,所以循環(huán)結構就是用于完成一些重復的操作,但它并不是單純的重復執(zhí)行,每次執(zhí)行時,語句的參數(shù)一般都是不同的。

按循環(huán)控制方式分類可分為手動循環(huán)和自動循環(huán)。手動循環(huán)在程序運行時通過反復操作控件實現(xiàn)某事件過程的反復執(zhí)行,自動循環(huán)是由程序中的語句控制的,是程序執(zhí)行時根據(jù)循環(huán)的條件自動實現(xiàn)的循環(huán)。自動循環(huán)又可分為有條件循環(huán)(當循環(huán)條件滿足或不滿足時才執(zhí)行的循環(huán))和無條件循環(huán)(無條件地執(zhí)行循環(huán))。 3.2循環(huán)程序

3.2.1for循環(huán)

1.for循環(huán)的一般形式

for循環(huán)允許一組命令以固定的和預定的次數(shù)重復。For循環(huán)的一般形式:

forvariable=values

commands

end

commands是循環(huán)體語句組,這里的循環(huán)語句是以end結尾的,這與C語言的結構不完全一致。values可以是如表3-1所示的格式之一。

(1)??initval:step:endval形式。索引變量以增量形式循環(huán),從初始值initval到結束值endval,增量步長為step,并重復循環(huán)。如果step為負數(shù),則以減量方式循環(huán),該形式的初始值initval大于結束值endval。

fors=s1:s2:s3

commands

...

end

注意:s是一個合法的字符串代表循環(huán)變量。s1、s2、s3可以是標量數(shù)字s1是起始值;s2是步長,如果步長s2的值為1,則可以省略;s3是終了值。例3-2-1

求出的值。

解該例可以作下列的循環(huán):

>>x=0;

fori=1:1:100

x=x+i;

end;

>>x

結果為x=5050

(2)?initval:endval形式。索引變量以增量形式循環(huán),從初始值initval到結束值endval,增量步長為1,并重復循環(huán)。

在上例的式子中,可以看到for循環(huán)語句中s2的值為1。在實際編程中,如果s2的步長值為1,則可以在該語句中省略,故該語句可以簡化成fori=1:100。

(3)?valArray形式。在每個迭代,從數(shù)組valArray列的子列創(chuàng)建一個列向量index。例如,在第一次迭代,index=valArray(:,1)。循環(huán)執(zhí)行n次,其中n是valArray列的最大數(shù)字,即for循環(huán)按照數(shù)組的列數(shù)決定循環(huán)次數(shù),每執(zhí)行一次for循環(huán),index就取數(shù)組的一個列作為其值,直到最后一列。

forindex=V

commands

end

在for和end語句之間的循環(huán)體語句組“commands”按數(shù)組中的每一列執(zhí)行一次。在每一次迭代中,index被指定為數(shù)組的一列,在第n次循環(huán)中,index=V(:,n),即V的第n列。例如:

A=[0.81470.63240.95750.95720.4218;

0.90580.09750.96490.48540.9157;

0.12700.27850.15760.80030.7922;

0.91340.54690.97060.14190.9595];

forn=A

s=n*2;

end

第5次循環(huán)結果:

0.8436

1.8314

1.5844

1.9190上面的語句就等價于:

forindex=1:5,m=A(:,index);

s1=m*2;

end

任何合法的數(shù)組生成語句都可以作為條件數(shù)組。

MATLAB并不要求循環(huán)點等間距,假設V為任意一個向量,則可以用

fori=V來表示循環(huán),這時valArray只有一個向量V,其元素必須是正整數(shù)。例如,在命令行輸入:

>>V=[12357];

forn=V

x(n)=sin(n*pi/10);

end

則輸出結果:

>>x

x=0.30900.58780.809001.000000.8090

程序語句的意思是:對n等于1到V,求所有語句的值,直至下一個end語句。第一次通過for循環(huán)n=1;第二次,n=2;如此繼續(xù),直至n=7。在實際編程中,采用循環(huán)語句會降低其執(zhí)行速度,所以前面的例3-3-1程序可以由下面的命令來代替:

i=1:100;

mysum=sum(i)

在這一語句中,首先生成了一個向量i,然后用內(nèi)部函數(shù)sum()求出i向量的各個元素之和。

更簡單地,該語句還可以寫成sum(1:100)。如果前面的100改成10?000,再運行這一程序,則可以明顯地看出,后一種方法編寫的程序比前一種方法快得多。

2.for循環(huán)的嵌套

在一個for循環(huán)中,可以根據(jù)需要嵌套另外的多個for循環(huán)。例如:

forn=1:5

form=5:-1:1

B(n,m)=n^2+m^2;

end

disp(n)

end

循環(huán)結果:

1

2

3

4

5例3-2-2

列出構成hibert矩陣的程序。

解程序如下:

formatrat,n=input('n='),

fori=1:n

forj=1:n

h(i,j)=1/(i+j-1);

end

end

h

n=5

h=

11/21/31/41/5

1/21/31/41/51/6

1/31/41/51/61/7

1/41/51/61/71/8

1/51/61/71/81/93.2.2while循環(huán)

與for循環(huán)以固定次數(shù)求一組命令的值相反,while循環(huán)以不定的次數(shù)求一組語句的值。while循環(huán)的一般形式是

whileexpression

commands

end

只要表達式expression里的所有元素都為真,就可以執(zhí)行while和end語句之間的commands。通常,表達式的求值給出一個標量值,但數(shù)組值也同樣有效。在數(shù)組情況下,所得到數(shù)組的所有元素必須都為真。例3-2-3while循環(huán)。

解在例3-2-1中同樣的問題,在while循環(huán)結構下可以表示為

>>x=0;i=1;

while(i<=100)

x=x+i;

i=i+1;

end

>>x

x=50503.2.3break語句

break命令強迫for循環(huán)或while循環(huán)提早結束,當執(zhí)行break語句時,MATLAB跳到循環(huán)體外下一個語句。

如果一個break語句出現(xiàn)在一個嵌套的for循環(huán)或while循環(huán)結構里,那么MATLAB只跳出break所在的那個循環(huán),不跳出整個嵌套結構。3.2.4continue語句

continue命令一般用在for循環(huán)或while循環(huán)中,通過if語句使用continue命令,當滿足語句if條件時,continue命令被調用。與break語句不同的是,執(zhí)行continue命令后,系統(tǒng)只是不再執(zhí)行相關命令,而不跳出當前循環(huán)體外。

例3-2-5

計算magic.m文件有效文本的行數(shù)。

解程序如下:

fid=fopen('magic.m','r');

count=0;

while~feof(fid)

line=fgetl(fid);

ifisempty(line)|strncmp(line,'%',1)

continue

end

count=count+1;

end

disp(sprintf('文件有效文本有%d行',count));

文件有效文本有25行。3.2.5end語句

end命令用于終止for、while、switch、try和if語句,每一個end與最近的for、while、switch、try或if語句成對出現(xiàn)。

end也可以用于索引表達式中,代表最后一個索引。例如:X(3:end)和

X(1,1:2:end-1)。 3.3分支結構

3.3.1條件轉移結構

很多情況下,命令的序列必須根據(jù)條件關系的檢驗結果有序地執(zhí)行,這種根據(jù)條件而轉移的分支結構是條件轉移結構。

判斷表達式緊跟在關鍵字if后面,使得它可以首先被計算,判斷其值為真否。若計算判斷表達式的結果為1,判斷值為真,則執(zhí)行其后的執(zhí)行語句;若結果為0,判斷值為假,則跳過、不予執(zhí)行。

條件轉移語句與C語言類似,條件轉移結構包括以下三種:if…end、if…else…end、if…elseif…else…end。

1.if…end

當只有一種選擇時,使用該形式。此時的程序結構如下:

ifexpression

commands

end

expression是條件表達式,commands是執(zhí)行代碼塊。這是最簡單的判斷語句,只有一個判斷語句。其中的表達式為邏輯表達式,當表達式expression結果為真時,執(zhí)行相應的語句commands,否則,直接跳到end下一段語句。

如果在表達式中的所有元素為真(非零),那么就執(zhí)行if和end語言之間的commands。當表達式包含有幾個邏輯子表達式時,即使前一個子表達式?jīng)Q定了表達式的最后邏輯狀態(tài),仍要計算所有的子表達式。例如:

>>apples=10;

>>cost=apples*25

cost=

250

>>ifapples>5 %如果購買量大于5,給予20%的價格折扣

cost=(1-0.2)*cost;

end

>>cost

cost=

200

2.if…else…end

當程序有兩個選擇時,可以選擇if…else…end結構,此時的程序結構如下:

ifexpression

commands1

else

commands2

end

當判斷表達式expression為真時,執(zhí)行代碼塊commands1,否則執(zhí)行代碼塊commands2。例3-3-2

輸入數(shù)n,判斷其正負性。

解程序如下:

m=input('m='),

ifm<0

disp('m為負數(shù)!'),

else

disp('m為正數(shù)!'),

end

m=-9

m=

-9

m為負數(shù)!

m=7

m=

7

m為正數(shù)!

3.if…elseif…else…end

上面的兩種形式中,分別包含一個選擇和兩個選擇,當判斷包含三個或多個選擇時,可以采用elseif語句,其結構如下:

ifexpression1

commands1

elseifexpression2

commands2

elseif...

...

...

else

commands

end例3-3-3

輸入數(shù)n,判斷其正負及奇偶性。

解程序如下:

n=input('n='),

ifn<0

A='負數(shù)',

elseifrem(n,2)==0

A='偶數(shù)',

else

A='奇數(shù)',

end

n=5

n=

5

A=

奇數(shù)3.3.2switch開關結構

MATLAB中的另一種分支結構為開關分支語句。開關分支語句的結構如下:

switchexpression

caseexpression_1

commands_1

caseexpression_2

commands_2

...

otherwise

commands

end其中的分支語句開關表達式expression為一個變量,可以是數(shù)值變量或者字符串變量,如果該變量的值與某一條件expression_n相符,則執(zhí)行相應的語句;否則執(zhí)行otherwise后面的語句。在每一個條件中,可以包含一個條件語句,可以包含多個條件,當包含多個條件時,將條件以單元數(shù)組的形式表示。例如:

>>method=‘Bilinear’;

>>switchlower(method)

case{‘linear’,‘bilinear’}

disp(‘Methodislinear’)

case‘cubic’

disp(‘Methodiscubic’)

case‘nearest’

disp(‘Methodisnearest’)

otherwise

disp(‘Unknownmethod.’)

end

顯示結果為

Methodislinear

MATLAB的分支語句類似于C語言的分支語句,但是又不完全相像,MATLAB開關語句與C語言的區(qū)別如下:

(1)當開關表達式的值等于表達式expression_1時,將執(zhí)行語句段commands_1,執(zhí)行完語句段commands_1后將轉出開關體,即MATLAB語句從上到下依次判斷條件,條件符合則執(zhí)行相應的代碼塊,之后退出該分支語句,無需像C語言那樣在下一個case語句前加break語句,所以本結構在這點上和C語言是不同的。

(2)當需要在開關表達式滿足若干個表達式之一時執(zhí)行某一程序段,則應該把這樣的一些表達式用大括號括起來,中間用逗號分隔。事實上,這樣的結構是MATLAB語言定義的單元結構。

(3)當前面枚舉的各個表達式均不滿足時,則將執(zhí)行otherwise語句后面的語句段,此語句等價于C語言中的default語句。

(4)在case語句引導的各個表達式中,不要用重復的表達式,否則列在后面的開關通路將永遠也不能執(zhí)行。

(5)程序的執(zhí)行結果和各個case語句的次序是無關的。例3-3-4

判斷輸入數(shù)n的奇偶空的程序。

解程序如下:

n=input('n=');

switchmod(n,2);

case1;A='奇';

case0;A='偶';

otherwise;A='空';

end

A

n=6

A=偶3.3.3try-catch試探結構

MATLAB從5.2版本開始提供了一種新的試探式語句結構,用于捕獲MATLAB編譯時出現(xiàn)的錯誤,其一般的形式為

try

語句段1

catch

語句段2

end

try塊以關鍵字try開始,結束于catch關鍵字,catch塊以關鍵字catch開始,結束于end關鍵字。本語句結構首先試探性地執(zhí)行語句段1,如果在此段語句執(zhí)行過程中沒有出現(xiàn)錯誤,則直接跳到end。

如果在此段語句執(zhí)行過程中出現(xiàn)了錯誤,則直接跳到catch模塊。在catch模塊中將錯誤信息賦給保留的lasterr變量,轉而執(zhí)行語句段2中的語句。語句段2可以根據(jù)獲取的該錯誤信息,執(zhí)行相應的動作。

try-catch試探結構也可以嵌套使用。 3.4人機交互語句

3.4.1echo命令

echo命令使文件命令在執(zhí)行時可見,對程序的調試和演示有用。語法如下:

echoon/off:打開(關閉)?echo命令。

echo:在打開、關閉echo命令之間切換。

echofilenameon/off:打開(關閉)文件名為filename的M文件。

echoon/offall:打開(關閉)所有的M文件。3.4.2用戶輸入提示命令input

input命令顯示用戶輸入提示,并接受用戶輸入。語法如下:

(1)?evalResponse=input(prompt):在屏幕上顯示提示的字符串,等候用戶在鍵盤的輸入,并賦值于變量evalResponse。

(2)?strResponse=input(prompt,'s'):把用戶在鍵盤的輸入,作為一個MATLAB串返回。例如:

>>R=input(‘Whatisyourname?’,’s’)3.4.3等待用戶反應命令pause

pause命令暫停程序執(zhí)行,等待用戶反應。語法如下:

pause:pause命令暫停程序執(zhí)行,等待用戶反應,用戶單擊任意鍵后,程序重新開始執(zhí)行。

pause(n):n秒后繼續(xù)運行。

pauseon:顯示并執(zhí)行pause命令。

pauseoff:顯示但不執(zhí)行該命令。 3.5程序的常見錯誤處理

3.5.1錯誤的產(chǎn)生

在MATLAB程序設計或開發(fā)函數(shù)M文件過程中,容易產(chǎn)生兩類錯誤:語法錯誤和運行時錯誤。

當MATLAB計算一個表達式的值或一個函數(shù)被編譯到內(nèi)存時會發(fā)現(xiàn)語法錯誤。一旦發(fā)現(xiàn)語法錯誤,MATLAB立即標志這些錯誤,并提供有關所遇到的錯誤類型,以及發(fā)生錯誤處M文件的行數(shù)。給定這些反饋信息,就很容易糾正這些錯誤。運行時的錯誤是指當程序試圖執(zhí)行一個系統(tǒng)不能運行的動作時導致的錯誤。當發(fā)現(xiàn)運行錯誤時,MATLAB把控制權返回給命令窗口和MATLAB的工作空間,失去了對發(fā)生錯誤的函數(shù)空間的訪問權,用戶不能詢問函數(shù)工作空間中的內(nèi)容排除問題。因此,即使MATLAB標志了運行錯誤,但找出錯誤一般比較困難。

含有選擇結構和循環(huán)結構的程序,比只含簡單的順序結構的程序出錯的概率大得多。3.5.2NaNs錯誤、除數(shù)為0的處理

1.NaNs錯誤

當一些操作結果導致空矩陣或NaNs時,最容易發(fā)生運行錯誤,任何有關NaNs的操作都返回NaNs值。因此,如果有可能出現(xiàn)NaNs結果,則當出現(xiàn)NaNs時,最好運用邏輯函數(shù)isnan()來執(zhí)行一些缺省操作。語法如下:

TF=isnan(A):返回一個與A大小相同的數(shù)組,包含邏輯1(即true),元素為NaN;邏輯0(即false),元素不為NaN。對于一個復數(shù)z,如果z的實數(shù)或虛數(shù)部分是NaN,isnan(z)返回1。如果z的實數(shù)或虛數(shù)部分都是有限或Inf,isnan(z)返回0。例如:

>>a=[-2-1012]

>>isnan(1./a)

Warning:Dividebyzero.

ans=

00000

因為空矩陣為零維,所以對空矩陣尋址常常導致錯誤。函數(shù)find()表示了可產(chǎn)生空矩陣結果的一般情況。如果函數(shù)find()的空矩陣輸出用于索引其他數(shù)組,所返回的值也將是空的。這樣,空矩陣具有傳播性質。例如:

>>x=pi*(1:4)

>>i=find(x>20)

>>y=2*x(i)

x=

3.14166.28329.424812.5664

i=

Emptymatrix:1-by-0

y=

Emptymatrix:1-by-0很清楚,當希望y具有有限維數(shù)和值時,可能發(fā)生運行錯誤。當執(zhí)行一個操作或使用可返回空結果的函數(shù)時,邏輯函數(shù)isempty()有利于為空矩陣定義一個缺省值,這樣可避免運行錯誤。語法如下:

TF=isempty(A):判斷數(shù)組(矩陣)A是否空。如果A是一個空的數(shù)組,返回邏輯true(1),否則為邏輯false(0)??諗?shù)組至少有一個維度的大小為零,例如,0?×?0或0?×?5。

2.除數(shù)為0的處理

除數(shù)為0是MATLAB編程的調試和分析中經(jīng)常遇到的問題,對該問題的解決,可以使程序開發(fā)事半功倍。例如:

>>x=(-3:3)/3

x=

-1.0000-0.6667-0.333300.33330.66671.0000

由于x的第4個元素為0,當把x作為除數(shù)進行除法運算時,就出現(xiàn)了除數(shù)為0的情況,MATLAB會發(fā)出除數(shù)為0的警告,并在該位置給出NaN的結果(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論