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

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章MATLAB程序設(shè)計(jì)3.1概述3.2循環(huán)程序3.3分支結(jié)構(gòu)3.4人機(jī)交互語(yǔ)句3.5程序的常見錯(cuò)誤處理 3.1概述

3.1.1MATLAB程序設(shè)計(jì)方法

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

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

MATLAB作為一種常用的編程語(yǔ)言,支持各種決策或流程控制結(jié)構(gòu)。流程控制極其重要,因?yàn)樗眠^(guò)去、現(xiàn)在的計(jì)算影響將來(lái)的結(jié)果。MATLAB程序結(jié)構(gòu)分為順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),具體如圖3-1所示。

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

1.順序結(jié)構(gòu)

順序程序結(jié)構(gòu)是一種最簡(jiǎn)單的程序結(jié)構(gòu),將MATLAB語(yǔ)句按先后次序排列即可。系統(tǒng)在編譯程序時(shí),按照程序的物理位置順序執(zhí)行。這種程序容易編制,但是結(jié)構(gòu)單一,能夠?qū)崿F(xiàn)的功能有限。例如:

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

s1=a+b;

s2=s1+c;

s3=s2/s2;

2.分支結(jié)構(gòu)

程序在運(yùn)行過(guò)程中要根據(jù)不同的情況或條件作出判斷,并依據(jù)判斷的結(jié)果轉(zhuǎn)向相應(yīng)的處理程序,這種程序結(jié)構(gòu)稱為分支結(jié)構(gòu)。

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

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

分支結(jié)構(gòu)程序設(shè)計(jì)需要使用關(guān)系運(yùn)算、邏輯運(yùn)算、條件運(yùn)算等。

3.循環(huán)結(jié)構(gòu)程序設(shè)計(jì)

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

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

3.2.1for循環(huán)

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

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

forvariable=values

commands

end

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

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

fors=s1:s2:s3

commands

...

end

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

求出的值。

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

>>x=0;

fori=1:1:100

x=x+i;

end;

>>x

結(jié)果為x=5050

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

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

(3)?valArray形式。在每個(gè)迭代,從數(shù)組valArray列的子列創(chuàng)建一個(gè)列向量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ù)組的一個(gè)列作為其值,直到最后一列。

forindex=V

commands

end

在for和end語(yǔ)句之間的循環(huán)體語(yǔ)句組“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)結(jié)果:

0.8436

1.8314

1.5844

1.9190上面的語(yǔ)句就等價(jià)于:

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

s1=m*2;

end

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

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

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

>>V=[12357];

forn=V

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

end

則輸出結(jié)果:

>>x

x=0.30900.58780.809001.000000.8090

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

i=1:100;

mysum=sum(i)

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

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

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

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

forn=1:5

form=5:-1:1

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

end

disp(n)

end

循環(huán)結(jié)果:

1

2

3

4

5例3-2-2

列出構(gòu)成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ù)求一組語(yǔ)句的值。while循環(huán)的一般形式是

whileexpression

commands

end

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

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

>>x=0;i=1;

while(i<=100)

x=x+i;

i=i+1;

end

>>x

x=50503.2.3break語(yǔ)句

break命令強(qiáng)迫f(wàn)or循環(huán)或while循環(huán)提早結(jié)束,當(dāng)執(zhí)行break語(yǔ)句時(shí),MATLAB跳到循環(huán)體外下一個(gè)語(yǔ)句。

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

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

例3-2-5

計(jì)算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語(yǔ)句

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

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

X(1,1:2:end-1)。 3.3分支結(jié)構(gòu)

3.3.1條件轉(zhuǎn)移結(jié)構(gòu)

很多情況下,命令的序列必須根據(jù)條件關(guān)系的檢驗(yàn)結(jié)果有序地執(zhí)行,這種根據(jù)條件而轉(zhuǎn)移的分支結(jié)構(gòu)是條件轉(zhuǎn)移結(jié)構(gòu)。

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

條件轉(zhuǎn)移語(yǔ)句與C語(yǔ)言類似,條件轉(zhuǎn)移結(jié)構(gòu)包括以下三種:if…end、if…else…end、if…elseif…else…end。

1.if…end

當(dāng)只有一種選擇時(shí),使用該形式。此時(shí)的程序結(jié)構(gòu)如下:

ifexpression

commands

end

expression是條件表達(dá)式,commands是執(zhí)行代碼塊。這是最簡(jiǎn)單的判斷語(yǔ)句,只有一個(gè)判斷語(yǔ)句。其中的表達(dá)式為邏輯表達(dá)式,當(dāng)表達(dá)式expression結(jié)果為真時(shí),執(zhí)行相應(yīng)的語(yǔ)句commands,否則,直接跳到end下一段語(yǔ)句。

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

>>apples=10;

>>cost=apples*25

cost=

250

>>ifapples>5 %如果購(gòu)買量大于5,給予20%的價(jià)格折扣

cost=(1-0.2)*cost;

end

>>cost

cost=

200

2.if…else…end

當(dāng)程序有兩個(gè)選擇時(shí),可以選擇if…else…end結(jié)構(gòu),此時(shí)的程序結(jié)構(gòu)如下:

ifexpression

commands1

else

commands2

end

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

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

解程序如下:

m=input('m='),

ifm<0

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

else

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

end

m=-9

m=

-9

m為負(fù)數(shù)!

m=7

m=

7

m為正數(shù)!

3.if…elseif…else…end

上面的兩種形式中,分別包含一個(gè)選擇和兩個(gè)選擇,當(dāng)判斷包含三個(gè)或多個(gè)選擇時(shí),可以采用elseif語(yǔ)句,其結(jié)構(gòu)如下:

ifexpression1

commands1

elseifexpression2

commands2

elseif...

...

...

else

commands

end例3-3-3

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

解程序如下:

n=input('n='),

ifn<0

A='負(fù)數(shù)',

elseifrem(n,2)==0

A='偶數(shù)',

else

A='奇數(shù)',

end

n=5

n=

5

A=

奇數(shù)3.3.2switch開關(guān)結(jié)構(gòu)

MATLAB中的另一種分支結(jié)構(gòu)為開關(guān)分支語(yǔ)句。開關(guān)分支語(yǔ)句的結(jié)構(gòu)如下:

switchexpression

caseexpression_1

commands_1

caseexpression_2

commands_2

...

otherwise

commands

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

>>method=‘Bilinear’;

>>switchlower(method)

case{‘linear’,‘bilinear’}

disp(‘Methodislinear’)

case‘cubic’

disp(‘Methodiscubic’)

case‘nearest’

disp(‘Methodisnearest’)

otherwise

disp(‘Unknownmethod.’)

end

顯示結(jié)果為

Methodislinear

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

(1)當(dāng)開關(guān)表達(dá)式的值等于表達(dá)式expression_1時(shí),將執(zhí)行語(yǔ)句段commands_1,執(zhí)行完語(yǔ)句段commands_1后將轉(zhuǎn)出開關(guān)體,即MATLAB語(yǔ)句從上到下依次判斷條件,條件符合則執(zhí)行相應(yīng)的代碼塊,之后退出該分支語(yǔ)句,無(wú)需像C語(yǔ)言那樣在下一個(gè)case語(yǔ)句前加break語(yǔ)句,所以本結(jié)構(gòu)在這點(diǎn)上和C語(yǔ)言是不同的。

(2)當(dāng)需要在開關(guān)表達(dá)式滿足若干個(gè)表達(dá)式之一時(shí)執(zhí)行某一程序段,則應(yīng)該把這樣的一些表達(dá)式用大括號(hào)括起來(lái),中間用逗號(hào)分隔。事實(shí)上,這樣的結(jié)構(gòu)是MATLAB語(yǔ)言定義的單元結(jié)構(gòu)。

(3)當(dāng)前面枚舉的各個(gè)表達(dá)式均不滿足時(shí),則將執(zhí)行otherwise語(yǔ)句后面的語(yǔ)句段,此語(yǔ)句等價(jià)于C語(yǔ)言中的default語(yǔ)句。

(4)在case語(yǔ)句引導(dǎo)的各個(gè)表達(dá)式中,不要用重復(fù)的表達(dá)式,否則列在后面的開關(guān)通路將永遠(yuǎn)也不能執(zhí)行。

(5)程序的執(zhí)行結(jié)果和各個(gè)case語(yǔ)句的次序是無(wú)關(guān)的。例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試探結(jié)構(gòu)

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

try

語(yǔ)句段1

catch

語(yǔ)句段2

end

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

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

try-catch試探結(jié)構(gòu)也可以嵌套使用。 3.4人機(jī)交互語(yǔ)句

3.4.1echo命令

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

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

echo:在打開、關(guān)閉echo命令之間切換。

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

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

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

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

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

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

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

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

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

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

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

3.5.1錯(cuò)誤的產(chǎn)生

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

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

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

1.NaNs錯(cuò)誤

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

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

>>a=[-2-1012]

>>isnan(1./a)

Warning:Dividebyzero.

ans=

00000

因?yàn)榭站仃嚍榱憔S,所以對(duì)空矩陣尋址常常導(dǎo)致錯(cuò)誤。函數(shù)find()表示了可產(chǎn)生空矩陣結(jié)果的一般情況。如果函數(shù)find()的空矩陣輸出用于索引其他數(shù)組,所返回的值也將是空的。這樣,空矩陣具有傳播性質(zhì)。例如:

>>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很清楚,當(dāng)希望y具有有限維數(shù)和值時(shí),可能發(fā)生運(yùn)行錯(cuò)誤。當(dāng)執(zhí)行一個(gè)操作或使用可返回空結(jié)果的函數(shù)時(shí),邏輯函數(shù)isempty()有利于為空矩陣定義一個(gè)缺省值,這樣可避免運(yùn)行錯(cuò)誤。語(yǔ)法如下:

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

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

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

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

x=

-1.0000-0.6667-0.333300.33330.66671.0000

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論