版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
用MATLAB語言編寫的可在MATLAB中運(yùn)行的程序,稱為M文件。M文件包含兩類:命令文件和函數(shù)文件。兩者區(qū)別在于:(1)命令文件沒有輸入?yún)?shù),也不返回輸出參數(shù),而函數(shù)文件可以輸入?yún)?shù),也可返回輸出參數(shù);(2)命令文件對工作空間中的變量進(jìn)行操作,而函數(shù)文件的變量為局部變量,只有其輸入、輸出變量保留在工作空間中;(3)一般來說,命令文件用于把很多需在命令窗口輸入的命令放在一起,而函數(shù)文件用于把重復(fù)的程序段封裝起來,使程序更加簡潔。用任何文本編輯器都可編寫M文件。在MATLAB的命令窗口中可以運(yùn)行M文件。無論是函數(shù)文件還是命令文件都可被別的程序調(diào)用。7.1M文件
由于命令文件沒有輸入?yún)?shù)和輸出參數(shù),只是一些命令行的組合,所以命令文件比函數(shù)文件簡單。命令文件可對工作空間中的變量進(jìn)行操作,也可生成新的變量。即使命令文件運(yùn)行結(jié)束,命令文件產(chǎn)生的變量仍將保留在工作空間中,直到關(guān)閉MATLAB或用相關(guān)命令刪除。下面是命令文件例子,在文本編輯器中輸入下列命令行,并存為flowerpetal.m。
t=-pi:0.01:pi;
r=2*sin(5*t).^2;
polar(t,r)
在MATLAB的命令窗口中鍵入flowerpetal,將會畫出一系列的花瓣?duì)顖D形。圖7.1花瓣圖案
調(diào)用該命令文件時(shí),不用輸入?yún)?shù),也沒有輸出參數(shù),文件自身建立需要的變量。當(dāng)文件執(zhí)行完畢后,用命令whos可以查看工作空間中的變量??梢娮兞縯,r仍然保留在工作空間中。
與命令文件相比,函數(shù)文件稍微復(fù)雜一些。下面為一個(gè)只有兩行的函數(shù)文件例子。
function
c=myfile(a,h)
c=sqrt((a.^2)+(b.^2))
一旦該函數(shù)文件建立,在MATLAB的命令窗口或在別的文件里面,就可以用下列命令調(diào)用。
>>a=4
>>b=3
>>c=myfile(a,b)
結(jié)果為:
C=
5.0000
一個(gè)典型的MATLAB的函數(shù)文件結(jié)構(gòu)如下:
functionc=soundspeed(s,t,p)%soundspeedcomputesthespeedofsoundinwater%wherecisthespeedofsoundinwaterinm/s
%Usageofthisfunction;%output=soundspeed(input)%RogerJans,1999-12-12.t=0:.1:35;
%形成向量
該函數(shù)文件包含以下幾部分:
a.函數(shù)定義行
文件的第一行為函數(shù)定義行,該行定義函數(shù)名、輸入?yún)?shù)和輸出參數(shù)的個(gè)數(shù)。
b.H1行
H1行的字面意思為幫助信息的第一行,在上述文件中為第二行。當(dāng)用命令lookfor查詢該函數(shù)的幫助信息時(shí),將顯示該行內(nèi)容。
c.幫助體
文件中兩空行之間的部分。當(dāng)對該函數(shù)單獨(dú)查詢幫助信息時(shí),將顯示幫助體和HI行的內(nèi)容。
d.函數(shù)體
函數(shù)文件中除函數(shù)定義行、HI行和幫助體之外的文本,這些命令執(zhí)行計(jì)算、賦值等實(shí)質(zhì)性的工作。
e.注釋部分
在函數(shù)體中以符號“%”開始直到該行結(jié)束的部分表示對程序的注釋。如上面文件中倒數(shù)第一行的后一部分為注釋語句。
在函數(shù)定義行functionc=soundspeed(s,t,p)中,function為函數(shù)文件的關(guān)鍵字,表明該文件為函數(shù)文件:c為輸出參數(shù);soundspeed為函數(shù)名;s,t,p為輸入變量。
MATLAB的所有函數(shù)文件都遵從這種定義格式。當(dāng)函數(shù)的輸出參數(shù)不只一個(gè)時(shí),用中括號“[]”把輸出參數(shù)括起來,參數(shù)之間用逗號分開。如果有輸入變量時(shí),用小括號括起來,當(dāng)個(gè)數(shù)不只一個(gè)時(shí),用逗號分開。當(dāng)函數(shù)無輸出參數(shù)時(shí),輸出參數(shù)項(xiàng)空缺(等號也省略)或者用空的中括號表示。如:
functionprintrcsults(x)
function[]=printresuits(x)
當(dāng)調(diào)用函數(shù)時(shí),輸入?yún)?shù)和輸出參數(shù)可以和定義行的變量名不同,這正如在FORTRAN里函數(shù)調(diào)用時(shí),形式參數(shù)和實(shí)際參數(shù)可以不同名一樣。
MATLAB對函數(shù)名的限制如同變量名。函數(shù)文件名由函數(shù)名再加上后綴“.m”組成,例如函數(shù)文件名test.m。當(dāng)函數(shù)文件名和函數(shù)定義行的函數(shù)名不同時(shí),MATLAB將忽略函數(shù)名而確認(rèn)文件名。所以,當(dāng)編寫函數(shù)文件時(shí),文件名可以和函數(shù)名不同,但調(diào)用時(shí)應(yīng)該使用文件名。不過最好把文件名和函數(shù)名統(tǒng)一,以免出錯(cuò)。
函數(shù)文件一旦編寫好之后,就可在命令窗口或別的文件中調(diào)用。調(diào)用的格式和函數(shù)文件的定義格式相同,只是把定義時(shí)的參數(shù)名換成相應(yīng)的變量名。例如:求所有小于2000且為2的整數(shù)次冪的正整數(shù)。(1)命令文件
f(1)=2;
k=1;
whilef(k)<1000
f(k+1)=f(k)*2;
k=k+l;
end
f,k
保存該文件為t.m。在MATLAB命令窗口中鍵入文件名t,運(yùn)行結(jié)束后可在屏幕上看到以下內(nèi)容。
f=
248163264128565121024
k=
10
functionf=tt(n)
f(1)=2;
k=1;
whilef(k)<ceil(n/2)
%ceil函數(shù)取最近的正整數(shù)
f(k+1)=f(k)*2;
k=k+l;
end
f
保存該文件為tt.m。在MATLAB命令窗口中鍵入以下命令,便可求所有小于2000的2的正整數(shù)次冪。
tt(2000)
f=
2481632641282565121024
當(dāng)MATLAB遇到一個(gè)新的名稱時(shí)(可能是變量名、函數(shù)名、子函數(shù)名等),將采用如下的先后順序來辨別:
a.檢查該名稱是否為目前上工作空間中的變量。
b.檢查該名稱是否為子函數(shù)名(子函數(shù)為函數(shù)文件的內(nèi)部函數(shù))。
c.檢查該名稱是否為局部函數(shù)名(局部函數(shù)放在一個(gè)單獨(dú)的目錄下,只有其上面一層目錄里的M文件可以調(diào)用這些函數(shù))。
d.檢查該名稱是否為MATLAB搜索路徑上的函數(shù)名。MATLAB將把按照搜索路徑的先后順序搜索到的第—個(gè)同名函數(shù)當(dāng)作該名稱引用的函數(shù)。
在命令窗門或其他的文件中調(diào)用函數(shù)文件時(shí),MATLAB將把函數(shù)編成偽碼,并保存在內(nèi)存中,在MATLAB關(guān)閉之前,該函數(shù)的偽碼一直保存著,以便再次調(diào)用該函數(shù)時(shí),不用重新編寫偽碼。當(dāng)然可以用clear命令清除內(nèi)存中的函數(shù)偽碼。命令功
能clear函數(shù)名刪除內(nèi)存中指定函數(shù)的偽碼clearfunctions刪除內(nèi)存中所有函數(shù)的偽碼clearall刪除內(nèi)存中所有變量和函數(shù)的偽碼Clear命令的使用
無論是函數(shù)還是命令文件的偽碼,都可以用pcode命令保存到文件中,以備下次使用時(shí)跳過編寫偽碼這一步,從而提高速度。一般情況下,MATLAB編寫偽碼的速度相當(dāng)快,是否使用預(yù)先編寫的偽碼對MATLAB的運(yùn)行速度影響不大。當(dāng)有大量的圖形界面時(shí),用pcode命令預(yù)先編寫偽碼可以大大提高速度。還有一種情況,當(dāng)想隱藏程序的源代碼時(shí),可以用pcode命令提供偽碼。例如:將把文件average.m編成偽碼并保存到文件average.p文件中。
pcodeaverage
調(diào)用MATLAB的函數(shù)時(shí),是通過按值傳遞方式傳遞參數(shù)。除了一個(gè)基本工作空間外,MATLAB還為每個(gè)被調(diào)用的函數(shù)分配一部分內(nèi)存,稱為函數(shù)工作空間。每個(gè)函數(shù)有自己的工作空間。在函數(shù)外部只能調(diào)用函數(shù)的輸出參數(shù),其他變量均不可調(diào)用。函數(shù)的工作空間和基本工作空間是相互獨(dú)立的,函數(shù)內(nèi)部的變量和基本上作空間中的變量是可以同名的。為了能夠調(diào)用函數(shù)內(nèi)部變量,可以在函數(shù)里把該變量定義為全局變量。
函數(shù)nargin和nargout分別用于檢查函數(shù)被調(diào)用時(shí)的輸入?yún)?shù)和輸出參數(shù)的個(gè)數(shù)。有這兩個(gè)函數(shù),編寫程序時(shí)可以對不同的調(diào)用情況做不同的處理,使函數(shù)調(diào)用更加靈活。例如,下面程序段中指定,當(dāng)用一個(gè)輸入?yún)?shù)調(diào)用該函數(shù)時(shí),求該參數(shù)的平方:當(dāng)用兩個(gè)輸入?yún)?shù)調(diào)用時(shí),求出兩個(gè)輸入?yún)?shù)的和。
function
c=testarg1(a,b)
if(nargin==1)
c=a.^2;
elseif(nargin=2)
c=a+b;
end
函數(shù)varargin和varargout允許用戶輸入任意多的輸入?yún)?shù)和輸出參數(shù)。MATLAB將把所有的輸入?yún)?shù)或輸出參數(shù)組成一個(gè)細(xì)胞數(shù)組。例如,下列函數(shù)在圖形上把所有輸入?yún)?shù)點(diǎn)用直線連接起來。
function
testvar(varargin)
%函數(shù)定義行
forI=1:length(varargin)
%對輸入?yún)?shù)組成的細(xì)胞數(shù)組的每一個(gè)元素作記號
X(I)=arargin{I}(1);
%取出輸入點(diǎn)的橫坐標(biāo)
Y(I)=varargin{l}(2);
%取出輸入點(diǎn)的縱坐標(biāo)
end
xmin=min(O,min(X)):
ymin=min(0,min(Y));
axis([xminfix(max(Y))+3yminfix(max(y))+3])%繪制坐標(biāo)軸。
plot(x,y)
%繪制圖形
調(diào)用函數(shù)testvar時(shí)的參數(shù)個(gè)數(shù)不限,下面的調(diào)用語句是合法的。
testvar([23],[15],[48],[65],[42],[903])
上述函數(shù)testvar的定義中細(xì)胞數(shù)組的引用采用varargm{I}(1)的格式,其中用大括h號{}括起來的下標(biāo)為細(xì)胞數(shù)組的第幾個(gè)元素,用小括號()括起來的下標(biāo)為大括號對應(yīng)的元素的分量。函數(shù)varargout的應(yīng)用和函數(shù)varargin相似,由于調(diào)用函數(shù)的的輸出參數(shù)的個(gè)數(shù)不定,在編程中將用到函數(shù)nargout。例如,下列函數(shù)將輸入的橫坐標(biāo)向量和縱坐標(biāo)向量的相應(yīng)元素配對,形成點(diǎn),輸出點(diǎn)坐標(biāo)。
function[varargou]=change(arrayin)
fori=1:nargout
varargout{I}=arrayin(:,i)
end
當(dāng)輸入三個(gè)點(diǎn)的橫坐標(biāo)向量和縱坐標(biāo)向量組成的矩陣a=[123;678]后,用命令[pl,p2,p3]=change(a)調(diào)用change函數(shù),將得到三個(gè)點(diǎn)的坐標(biāo):p1=(1,6),p2=(2,7),p3=(3,8)。事實(shí)上,在函數(shù)調(diào)用時(shí),細(xì)胞數(shù)組和普通參數(shù)是可以混合使用的,這時(shí)應(yīng)該把varargin和varargout放到參數(shù)列表的最后。下面的函數(shù)調(diào)用行都是合法的。
function[outl,out2]=tt(a,b,varargin)
function[I,j,varargout]=ttt(x1,y1,x2,y2,flag)
7.2局部變量與全局變量
在MATLAB里,全局變量用命令global定義。全局變量可以被所有定義該變量為全局變量的函數(shù)使用,如果想在命令行中使用全局變量,也要定義該變量為全局變量。函數(shù)中的變量若為局部變量,則只能被本函數(shù)調(diào)用,在其他函數(shù)里和基本的工作空間中都不能調(diào)用。和在命令窗口中一樣,在M文件中,變量在使用前無需定義其維數(shù)和每維的大小。但把一個(gè)變量賦給另一個(gè)變量時(shí),要求等號右邊的變量有值。在MATLAB里,變量名區(qū)分大小寫。
下面為一個(gè)使用全局變量的例子。
functionall=weight_add(x,y)
%addtwovariablewithdifferentweight
globalALPHABETA
all=ALPHA*x+BETA*y;
函數(shù)weight_add將輸入的參數(shù)加權(quán)相加,建立文件weight_add.m,在第三行定義全局變量ALPHA和BETA。
在命令窗口中鍵入:
global
ALPHABETA
ALPHA=1
BETA=2
all=weight_add(1,1);
將在基本工作空間中生成變量a11,其值為3。由于在函數(shù)weight_add空間和基本工作空間中都把ALPHA和BETA兩個(gè)變量定義為全局變量。只要在命令窗口中改變ALPHA和BETA的值,就可改變加權(quán)值,而無需修改weight_add.m文件。
上例只在函數(shù)weight_add和命令窗口中把ALPHA和BETA變量定義為全局變量,在編程時(shí),可在所有需要調(diào)用全局變量的函數(shù)里定義全局變量,這樣就可實(shí)現(xiàn)變量共享。為了在基本工作空間中使用全局變量,也要定義全局變量。
在函數(shù)文件里,全局變量的定義語句應(yīng)放在變量使用以前,為了便于了解所有的全局變量,一般把全局變量的定義語句放在文件的前部。一般來說,全局變量的取名應(yīng)更能反應(yīng)變量的具體意思,一般用大寫字母表示,以防被誤用。
變量名含
義ans當(dāng)在命令窗口中輸入表達(dá)式而不賦值給任何變量時(shí),Matlab自動將該值賦給ans。變量ans保存其最近一次被使用的值。epsMatlab計(jì)算浮點(diǎn)數(shù)的誤差限。realmaxMatlab所能表示的最大浮點(diǎn)數(shù)。realminMatlab所能表示的最小浮點(diǎn)數(shù)。pi3.1415926535897I,j虛數(shù)單位。inf無窮大,例如計(jì)算n/0(n非0)。NaN非數(shù),例如計(jì)算0/0,inf/inf。computer計(jì)算機(jī)類型和操作系統(tǒng)。flops統(tǒng)計(jì)該工作空間浮點(diǎn)數(shù)的計(jì)算次數(shù)。version所用Matlab的版本。
在MATLAB的工作空間中,有幾個(gè)特殊的變量值。下表列出了這些變量名及其含義。7.3數(shù)據(jù)類型MATLAB共有六種基本的數(shù)據(jù)類型,每一種類型都可以是一維、二維和多維的。這六種是:雙精度型(double)、字符型(char)、稀疏型(sparse),8位型(uint8)、細(xì)胞型(cell)和結(jié)構(gòu)型(struct)。一般把這六種類型的二維變量稱為矩陣,其中最常用的是雙精度矩陣和字符型數(shù)組。
MATLAB的計(jì)算都采用雙精度,MATLAB提供的絕大部分函數(shù)都是對雙精度矩陣和字符串操作的,其他幾種數(shù)據(jù)類型用于特殊的場合。比如8位型用于圖像處理,稀疏型用于稀疏矩陣,細(xì)胞型和結(jié)構(gòu)型一般用于編寫大型軟件。
數(shù)組在最上一層,表明MATLAB的所有數(shù)據(jù)類型都是向量。從大類上數(shù)組可分為字符型、細(xì)胞型、結(jié)構(gòu)型和數(shù)值型;數(shù)值型又可分為雙精度型和8位型;稀疏型是雙精度型的一種,因?yàn)橄∈杈仃嚨拿恳粋€(gè)元素都是以雙精度存儲和運(yùn)算的。圖7.2數(shù)據(jù)類型圖
六種數(shù)據(jù)類型的關(guān)系可用圖7.2表示。數(shù)據(jù)類型(class)舉例
解釋
double
[12;34]5+6i雙精度數(shù)值類型,是最常用的類型。char‘hello’字符數(shù)組,每個(gè)字符占16位。
sparsesparse(5)雙精度稀疏矩陣,只存儲矩陣中的非0元素。cell{17'hello'eye(2)]}細(xì)胞數(shù)組,數(shù)組中的每個(gè)元素可為不同類型、不同維數(shù)。struct
a.day=12;a.color='red'a.mat=magic(5);結(jié)構(gòu)數(shù)組相當(dāng)于數(shù)據(jù)庫的記錄,把相關(guān)的數(shù)據(jù)列在在一起,為屬性,不同屬性的數(shù)據(jù)類型可以不同。unit8unit8(magic(3))8位型,為無符號整數(shù),最大可表示255,不能進(jìn)行數(shù)學(xué)運(yùn)算。表7.3數(shù)據(jù)類型舉例
變量的數(shù)據(jù)類型可用函數(shù)isa來查看,其調(diào)用格式為:
isa(變量名,數(shù)據(jù)類型)
當(dāng)矩陣s為稀疏矩陣時(shí),下面三條命令都將返回1。
isa(s,'sparse')
isa(s,'double')
isa(s,'numeric')
所有MATLAB的六種數(shù)據(jù)類型都支持一定的函數(shù)和運(yùn)算(方法),子一層的數(shù)據(jù)類型支持其父一層的所有運(yùn)算,例如雙精度型數(shù)據(jù)支持所有數(shù)組一層的計(jì)算。數(shù)據(jù)類型方法
數(shù)組
多維下標(biāo)、組合(如'[ab]')、轉(zhuǎn)置、行列初等變換、數(shù)組變形(reshape)、求維數(shù)、各維的大小(size,length,ndims細(xì)胞型各元素用{}引用。字符型字符函數(shù)(sutrcmp,lower),計(jì)算時(shí)自動轉(zhuǎn)換成雙精度型。
數(shù)值型find函數(shù)、復(fù)數(shù)元素、冒號算符(1:10)。
雙精度型數(shù)學(xué)算符(+,-,*,/等)、邏輯算符(><&|等)、矩陣函數(shù)(eig、std等)、數(shù)學(xué)函數(shù)(sin、cos、sum、prod、sort等)。稀疏型稀疏函數(shù)和算符(/,.*,splu,spchol等)。結(jié)構(gòu)型屬性引用。
8位型存儲特性(詳見ImageProcessing工具箱)。表7.4數(shù)據(jù)類型及支持的方法
與其他應(yīng)用軟件不同之處在于,MATLAB不能用double、char來定義變量。之所以把數(shù)據(jù)類型分為六種,只是為了把具有相同性質(zhì)的數(shù)組歸納分類。
8位型數(shù)據(jù)不能做任何計(jì)算,在計(jì)算之前,必須用函數(shù)double轉(zhuǎn)換為雙精度數(shù)據(jù)。在MATLAB里,可以創(chuàng)建自定義數(shù)據(jù)類型,也可以為已有的數(shù)據(jù)類型增加新的使用方法。自己定義的數(shù)據(jù)類型可以和MATLAB已有的數(shù)據(jù)類型一樣使用。
7.4運(yùn)算符MATLAB的運(yùn)算符可分為三類:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符。其中算術(shù)運(yùn)算符的優(yōu)先級最高,其次是關(guān)系運(yùn)算符,再其次是邏輯運(yùn)算符。下面將分別介紹這三類運(yùn)算符和邏輯函數(shù)。
一、算術(shù)運(yùn)算符
按照運(yùn)算符的優(yōu)先級可把算術(shù)運(yùn)算符分為五級,在每一級里的運(yùn)算符有同樣的優(yōu)先級,在運(yùn)算時(shí)自左向右結(jié)合。各級包含的運(yùn)算符為:
①優(yōu)先級最高的是轉(zhuǎn)置符(.')、冪符(.^)、復(fù)共軛轉(zhuǎn)置(')、矩陣冪符('):
②標(biāo)量加(+)、標(biāo)量減(-);
③向量乘法(.*)、向量右除(./)、向量左除(.\)、矩陣乘法(*)、矩陣右除(/)、矩陣左除(\);
④加法(+)、減法(-);
⑤冒號運(yùn)算符(:)。
MATLAB默認(rèn)的運(yùn)算優(yōu)先等級可用括號強(qiáng)制改變。例如下面兩個(gè)算式的計(jì)算先后順序不一。
C=A./B.^2
C=(A./B).^2
大部分的算術(shù)運(yùn)算符只對相同維數(shù)的數(shù)組的對應(yīng)運(yùn)算作運(yùn)算。對于矩陣和向量,算術(shù)運(yùn)算符連接的兩個(gè)運(yùn)算數(shù)必須同維或者兩個(gè)中有一個(gè)是標(biāo)量。當(dāng)一個(gè)運(yùn)算數(shù)是標(biāo)量時(shí),運(yùn)算符將把標(biāo)量和另一個(gè)運(yùn)算數(shù)的每一個(gè)運(yùn)算數(shù)進(jìn)行運(yùn)算。
二、關(guān)系運(yùn)算符關(guān)系運(yùn)算符對于程序的流程控制非常有用,在MATLAB的循環(huán)和條件控制中經(jīng)常使用。MATLAB里共有六個(gè)關(guān)系運(yùn)算符,它們是:
<
小于
<=
小于等于
>
大于
>=
大于等于
==
等于
~=
不等于
所有關(guān)系運(yùn)算符連接的兩個(gè)運(yùn)算數(shù)必須是同維、每維同大小的。對于長方形矩陣和向量,兩個(gè)運(yùn)算數(shù)或者同維、同大小,或者其中—個(gè)為標(biāo)量。當(dāng)有—個(gè)運(yùn)算數(shù)是標(biāo)量時(shí),關(guān)系運(yùn)算符把標(biāo)量和另一個(gè)運(yùn)算數(shù)的每個(gè)運(yùn)算進(jìn)行比較。關(guān)系運(yùn)算符將生成一個(gè)0-1矩陣,當(dāng)運(yùn)算數(shù)相應(yīng)元素對于關(guān)系運(yùn)算符為真時(shí),對應(yīng)位置上生成1,否則為0。切記,MATLAB的所有關(guān)系運(yùn)算符都是對運(yùn)算數(shù)中對應(yīng)的元素逐個(gè)計(jì)算。例如:
A=[276;90-10;30.56];
B=[80.20;325;407]:
A<B
ans=
100
011
l01
當(dāng)一個(gè)矩陣A和空矩陣用關(guān)系運(yùn)算符比較時(shí),MATLAB將給出錯(cuò)誤信息。要檢驗(yàn)一個(gè)矩陣是否為空矩陣,應(yīng)使用函數(shù)isempty。例如,當(dāng)矩陣A為空矩陣時(shí),命令isempty(A)將得到1。
A=[123;456];B=[];
isempty(A)ans=0isempty(B)ans=1
四、邏輯函數(shù)除了與(&)、或(|)、非(~)這三個(gè)邏輯運(yùn)算符以外,MATLAB還提供了一些邏輯運(yùn)算函數(shù)。主要有異或函數(shù)(xor)、all函數(shù)、any函數(shù)、isnan函數(shù)、isinf函數(shù)和isfinite
函數(shù)。異或函數(shù)xor對兩個(gè)運(yùn)算數(shù)作異或運(yùn)算。當(dāng)兩個(gè)運(yùn)算數(shù)中對應(yīng)元素邏輯上的真假值相反時(shí),表達(dá)式的值為真,其他情況(兩個(gè)都真或兩個(gè)都假)為假。異或函數(shù)xor返回值為0-1矩陣。當(dāng)邏輯表達(dá)式的值為真時(shí),返回元素1,否則返回0。例如,變量a和b都為1時(shí),命令xor(a,b)將得到ans=0。
當(dāng)向量的元素都為真時(shí),all函數(shù)將返回變量1,否則返回變量0。對于矩陣,函數(shù)all對列操作。當(dāng)某列的元素都為真時(shí),返回值1。函數(shù)all對于矩陣的最終運(yùn)算結(jié)果為一個(gè)行向量。例如,
u=[12340;32451];
All(u)ans=11110
當(dāng)向量中至少有一個(gè)元素為真時(shí),函數(shù)any將返回變量1;只有當(dāng)向量中的所有元素全為假才返回變量0。和函數(shù)all一樣,當(dāng)運(yùn)算數(shù)為矩陣時(shí),函數(shù)any將逐列運(yùn)算,最后返回結(jié)果為一個(gè)0-1行向量。
函數(shù)isnan、isinf和isfinite返回和運(yùn)算數(shù)同維的數(shù)組。當(dāng)運(yùn)算數(shù)的元素為NaN時(shí),函數(shù)isnan在返回?cái)?shù)組的相應(yīng)位置返回1,否則返回0。當(dāng)運(yùn)算數(shù)的元素為inf時(shí),函數(shù)isinf在返回?cái)?shù)組的相應(yīng)位置返回l,否則返回0。當(dāng)運(yùn)算數(shù)的元素不為inf和NaN時(shí),函數(shù)isfinite在相應(yīng)的位置返回1,否則返回0。下面為一個(gè)使用函數(shù)isnan、isinf和isfinite的例子。在程序段第三行中的運(yùn)算符“/”表示對矩陣的對應(yīng)元素相除。
A=[015;2NaNinf];B=[001;525inf];C=A./B
Warning:Dividebyzero.
C=NaNInf5.00000.4000NaNNaN
isfinite(C)
ans=001100
isnan(C)
ans=100011
isinf(C)ans=010000
當(dāng)NaN和別的數(shù)計(jì)算時(shí),所得結(jié)果均為NaN,事實(shí)上,所有含NaN的表達(dá)式的值均為NaN,一般稱這為NaN的傳播性。表達(dá)式inf/inf、0/0的值為NaN。表達(dá)式1/inf的值為0。
函數(shù)find用于于查找向量中的真元素的下標(biāo)。對于數(shù)值向量,真元素即為非0元素。在find的常用調(diào)用格式中,將返回向量中滿足要求的下標(biāo)組成的列向量。下面的程序段給出它的用法。
A=magic(3)%生成三階魔方矩陣。
A=
816
357
492
i=findt(A>5)%查找命令A(yù)>5生成的0-1矩陣中的非0元素,并將非元素在矩陣中的一維下標(biāo)生成列向量i。
i=
1
6
7
8
A(i)=1000%將魔方矩陣中下標(biāo)為i的元素賦值為1000。
A=
100011000
3
51000
41000
2
五、位運(yùn)算符
matlab提供了豐富的位運(yùn)算功能。位運(yùn)算符見表7.4。
位運(yùn)算符說明bitand位對位的ANDbitcmp每個(gè)位的NOTbitor每個(gè)位的ORbitxor位對位的XORbitset設(shè)定某位bitget取得某位bitshift移位
例如,數(shù)字10的二進(jìn)制值是1010,4的二進(jìn)制是0100,因此數(shù)字10和4的bitor應(yīng)為14,可驗(yàn)證如下:
>>bitor(22,4)
ans=
14
又例如,將18的二進(jìn)制表示法向左移一位,其效果相當(dāng)于乘2,可驗(yàn)證如下:
>>bitshift(10,1)
>>ans=
36
六、集合運(yùn)算符
matlab提供了豐富的集合運(yùn)算功能。位運(yùn)算符見表7.5。
集合預(yù)算符說明union并集intersect交集setdiff差集setxor集合的XORunique返回最小等效集合(每個(gè)元素只出現(xiàn)一次)ismember測試元素是否屬于某集合例如:
>>x=[123456];
>>y=[1155999];
union_result=union(x,y)
union_result=
1
2
3
4
5
6
9
>>intersect_result=intersect(x,y)
intersect_result=
1
5
>>setdiff_result=setdiff(x,y)
setdiff_result=
2
3
4
6
>>setxor_result=setor(x,y)
setor_result=
2
3
4
6
9
7.5程序流程控制
程序流程控制MATLAB提供重復(fù)循環(huán)(Loop)及條件判斷(Condition)等程序流程控制(FlowControl)的語句,最簡單的程序重復(fù)執(zhí)行語句是for循環(huán)(For-loop),其基本使用語法為:
for變量=向量
表達(dá)式;
end
其中變量的值會被依次設(shè)定為向量的每一個(gè)元素值,來重復(fù)執(zhí)行介于for和end之間的表達(dá)式。因此,若無意外情況,表達(dá)式執(zhí)行的次數(shù)會等于矩陣的列數(shù)。
>>x=zeros(1,6);
%預(yù)先分配矩陣x為一個(gè)維數(shù)1*6的零矩陣
>>fori=1:6
>>
x(i)=1/i;
>>end
>>disp(x)
%顯示矩陣x的內(nèi)容
1.0000
0.5000
O.3333
0.2500
0.2000
0.1667
在上例中,矩陣x最初是一個(gè)1*6大小的零矩陣,在for循環(huán)中,變量i的值依次是1到6(即矩陣[123456]中的每一列向量內(nèi)容),因此矩陣x的第i個(gè)元素的值依次被設(shè)為1/i。>>x=[2451169];>>forn=x>>y(n)=n/10;>>end>>y>>y=00.200000.40000.50000.6000000.900001.1000
循環(huán)次數(shù)決定于x數(shù)組的列數(shù),for循環(huán)一次,n就取x中的一列值作為其值,一次執(zhí)行結(jié)束之后,n就取x下一列的值,直到x的最后一列。Y則取x向量中最大值作為數(shù)組元素的個(gè)數(shù),即y(1)至y(11)。
另一個(gè)常用到的程序重復(fù)執(zhí)行語句是while循環(huán)(While—loop),其基本使用語法為:
while條件式
表達(dá)式;
end
也就是說,只要條件式成立,表達(dá)式就會一再被重復(fù)執(zhí)行。例如,先前用for循環(huán)產(chǎn)生的調(diào)和序列的做法,可用while循環(huán)改寫如下:
>>x=zeros(1,6);
%x是—個(gè)l*6的零矩陣
>>i=1;
>>whilei<=6
>>x(i)=1/i;
>>i=i+l;
>>end
>>disp(x)
1.0000
0.5000
0.3333
0.2500
0.2000
0.1667
提示:預(yù)先分配矩陣
上面的幾個(gè)例子中,使用zeros來預(yù)先分配(Pre-allocate)了一個(gè)適當(dāng)大小的矩陣。若不預(yù)先分配矩陣,程序仍可執(zhí)行,但此時(shí)MATLAB需要?jiǎng)討B(tài)地增加(或減小)矩陣的大小,因而降低了程序的執(zhí)行效率。所以在使用一個(gè)矩陣時(shí),著能在事前知道其大小,則最好先使用zeros或ones等命令來預(yù)先分配矩陣所需的內(nèi)存大小,以提高程序的執(zhí)行效率。
MATIAB也提供根據(jù)條件判斷來控制程序流程的語句,最常見為if-else-end的語句組合,其基本語法為:
if
條件式
表達(dá)式;
else
表達(dá)式;
end
>>ifrand(1,1)>0.5
>>disp('GivenrandomnumberisgreaterthanO.5.');
>>else
>>disp('GivenrandomnumberiSlessthan0.5.');
>>end
Givenrandomnumberislessthan0.5.
有關(guān)程序流程控制,在后面會有更詳盡的介紹。
switch語句,其語法格式為:
switch表達(dá)式(%可以是標(biāo)量或字符串)
case值1
語句1case值2
語句2
….otherwise
語句nend
表達(dá)式的值和哪種情況(case)的值相同,就執(zhí)行哪種情況中的語句,如果不同,則執(zhí)行otherwise中的語句。格式中也可以不包括otherwise,如果表達(dá)式的值與列出的各種情況都不相同,則繼續(xù)向下執(zhí)行。
break是Matlab中的強(qiáng)制跳轉(zhuǎn)命令,通常用在for和while循環(huán)中,當(dāng)執(zhí)行這個(gè)命令之后,Matlab就跳出for和while循環(huán),轉(zhuǎn)到循環(huán)之外的下一條語句。>>EPS=1;>>fornum=1:1000EPS=EPS/2;
if(1+EPS)<=1EPS=EPS*2
break
endendEPS=2.2204e-016
提示:break命令僅迫使程序跳出一個(gè)循環(huán)。
continue也是一個(gè)強(qiáng)制跳轉(zhuǎn)命令,當(dāng)Matalb遇到該命令時(shí),就立即跳到for或while循環(huán)的end處,結(jié)束一次循環(huán)。例如:>>EPS=1;>>fornum=1:1000EPS=EPS/2;
if(1+EPS)>1
continue
endEPS=EPS*2
break
endEPS=2.2204e-016
提示:在這continue命令對if-end結(jié)構(gòu)沒有任何影響。Try-catch模塊使得用戶能捕獲程序執(zhí)行過程中的的錯(cuò)誤,以便決定如何對錯(cuò)誤進(jìn)行響應(yīng)。格式如下:
try
語句1…catch
語句2end
在執(zhí)行語句1過程中,如果沒有錯(cuò)誤發(fā)生,程序控制就直接跳到end語句,如果出現(xiàn)錯(cuò)誤就立即轉(zhuǎn)移到catch語句,執(zhí)行語句2,在語句2中,通常會利用lasterr和lasterror函數(shù)獲取錯(cuò)誤信息,然后采取相應(yīng)的措施。例如:x=ones(4,2);y=4*eye(3)tryz=x*y;catchz=nan;disp(‘xandyarenotconfortmable.’)endzxandyarenotconfortmable.z=NaN7.6子函數(shù)
每一個(gè)函數(shù)文什可以包含多個(gè)函數(shù)。在函數(shù)文件的第一行定義的函數(shù)為主函數(shù),當(dāng)調(diào)用文件名時(shí),調(diào)用主函數(shù)。在函數(shù)文件中,除了第一行定義的函數(shù)外,其余的函數(shù)稱為子函數(shù)。子函數(shù)只能被該文件里的其他函數(shù)和主函數(shù)調(diào)用。
在函數(shù)文件里,子函數(shù)的定義和主函數(shù)相同。子函數(shù)的順序序是任意的。如果函數(shù)中包含return語句,則函數(shù)執(zhí)行到該語句終止,否則執(zhí)行到最后一行終止,使執(zhí)行權(quán)返回調(diào)用函數(shù)。例如:function
d=det(A)%DETdet(A)isthedeterminantofA.ifisempty(A)d=1;returnelse...end如果輸入矩陣為[]時(shí),d=1,函數(shù)返回到調(diào)用處。function
out=main_func(x)%主函數(shù)
recip=reciproc(x);%調(diào)用子函數(shù)
out=sum(recip);function
output=reciproc(input)%子函數(shù)
output=1./input;此函數(shù)可調(diào)用如下:>>main_func([123])ans=1.8333
當(dāng)在一個(gè)函數(shù)文件中調(diào)用函數(shù)時(shí),MATLAB首先檢查該函數(shù)是否為該文件的子函數(shù)。然后將檢查是否為局部函數(shù),然后再檢查該函數(shù)是否為搜索路徑上的M文件名。由于最先搜索的是子函數(shù)名,所以子函數(shù)的名字可以和其他的M文件名相同。放在子目錄private下的函數(shù)稱為局部函數(shù)。只有private子目錄的父目錄里的函數(shù)才能調(diào)用這些局部函數(shù)。例如在目錄A下建立子目錄private,子目錄private中的函數(shù)只能被目錄A中的函數(shù)調(diào)用。所有private中的函數(shù)都稱為局部函數(shù)。由于private中的函數(shù)在A目錄以外不能被調(diào)用,所有private中的函數(shù)和A目錄以外的函數(shù)可以同名,而不會互相干擾。7.7錯(cuò)誤與警告信息
在很多情況下,需要對程序中對不同的錯(cuò)誤情況采取相應(yīng)的措施。例如,當(dāng)運(yùn)行程序時(shí)輸入?yún)?shù)不對,希望程序能夠提示用戶;程序出錯(cuò)時(shí)希望顯示錯(cuò)誤信息;當(dāng)缺少某個(gè)參數(shù)時(shí)希望能采用默認(rèn)值計(jì)算等等。MATLAB提供了有效的錯(cuò)誤處理功能。
一、eval函數(shù)和lasterr函數(shù)函數(shù)eval和Iasterr是MATLAB處理錯(cuò)誤的基本工具。當(dāng)一個(gè)函數(shù)運(yùn)行出錯(cuò)時(shí),函數(shù)eval允許運(yùn)行另外一個(gè)函數(shù)。函數(shù)lasterr將給出一個(gè)包含最后一次錯(cuò)誤信息的字符串。
函數(shù)eval的處理錯(cuò)誤的功能是通過雙參數(shù)調(diào)用來實(shí)現(xiàn)的。其調(diào)用格式為:
eval('字符串1','字符串2')
當(dāng)字符串1提供的運(yùn)算能正常實(shí)現(xiàn)時(shí),忽略字符串2;當(dāng)字符串1運(yùn)行出錯(cuò)時(shí),則運(yùn)行字符串2。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新辦企業(yè)稅務(wù)登記財(cái)務(wù)制度
- 老干局財(cái)務(wù)制度
- 電子科技行業(yè)財(cái)務(wù)制度
- 接待中心財(cái)務(wù)制度
- 財(cái)務(wù)制度規(guī)范與業(yè)務(wù)流程
- 養(yǎng)老院老人健康監(jiān)測制度
- 養(yǎng)老院環(huán)境衛(wèi)生維護(hù)制度
- 施工現(xiàn)場施工防放射性物質(zhì)泄漏制度
- 壓力容器施工管理制度(3篇)
- 學(xué)校物業(yè)停車管理制度(3篇)
- 《筑牢安全防線 歡度平安寒假》2026年寒假安全教育主題班會課件
- 養(yǎng)老院老人生活設(shè)施管理制度
- 2026年稅務(wù)稽查崗位考試試題及稽查實(shí)操指引含答案
- (2025年)林業(yè)系統(tǒng)事業(yè)單位招聘考試《林業(yè)知識》真題庫與答案
- 2026版安全隱患排查治理
- 道路施工安全管理課件
- 2026年七臺河職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性考試備考題庫有答案解析
- 辦公樓電梯間衛(wèi)生管理方案
- 新生兒休克診療指南
- 專題學(xué)習(xí)活動 期末復(fù)習(xí)課件 新教材統(tǒng)編版八年級語文上冊
- VTE患者并發(fā)癥預(yù)防與處理
評論
0/150
提交評論