Matlab基本用法小結(jié)講解學習_第1頁
Matlab基本用法小結(jié)講解學習_第2頁
Matlab基本用法小結(jié)講解學習_第3頁
Matlab基本用法小結(jié)講解學習_第4頁
Matlab基本用法小結(jié)講解學習_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。Matlab基本用法小結(jié)-(3)字符串與字符串矩陣MATLAB的字符串是由單引號括起來的。如可以使用下面的命令賦值strA=Thisisastring.多個字符串可以用str2mat()函數(shù)構(gòu)造出字符串矩陣。如B=str2mat(strA,ksasaj,aa);字符串變量可以由下表中的命令進行操作:命令意義命令意義strcmp(A,B)比較A和B字符串是否相同。findstr(A,B)測試A是否為B的子字符串,或反過來strrep(A,s1,s2)在A中用s2替換s1length(A)字符串A的長度de

2、blank(A)刪除A字符串尾部的空格double(A)字符串轉(zhuǎn)換雙精度數(shù)據(jù)(4)單元數(shù)據(jù)結(jié)構(gòu)用類似矩陣的記號將給復雜的數(shù)據(jù)結(jié)構(gòu)納入一個變量之下。和矩陣中的圓括號表示下標類似,單元數(shù)組由大括號表示下標。B=1,AlanShearer,180,100,80,75;77,60,92;67,28,90;100,89,78B=1AlanShearer1804x3double訪問單元數(shù)組應該由大括號進行,如第4單元中的元素可以由下面的語句得出B4ans=10080757760926728901008978(5)結(jié)構(gòu)體MATLAB的結(jié)構(gòu)體有點象C語言的結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu)。每個成員變量用點號表示,如A.p表示A

3、變量的p成員變量。獲得該成員比C更直觀,仍用A.p訪問,而不用A-p。用下面的語句可以建立一個小型的數(shù)據(jù)庫。student_rec.number=1;student_=AlanShearer;student_rec.height=180;student_rec.test=100,80,75;77,60,92;67,28,90;100,89,78;student_recstudent_rec=number:1name:AlanShearerheight:180test:4x3double其中test成員為單元型數(shù)據(jù)。刪除成員變量可以由rmfield()函數(shù)進行,添加成員變量可以直

4、接由賦值語句即可。另外數(shù)據(jù)讀取還可以由setfield和getfield函數(shù)完成。(6)類與對象類與對象是MATLAB5.*開始引入的數(shù)據(jù)結(jié)構(gòu)。在MATLAB手冊中定義了一各很好的類-多項式類。該例子值得細讀,去體會類和對象的定義,重載函數(shù)編寫等信息。事實上,在實際工具箱設計中,用到了很多的類,例如在控制系統(tǒng)工具箱中定義了LTI(線性時不變系統(tǒng))類,并在此基礎上定義了其子類:傳遞函數(shù)類TF,狀態(tài)方程類SS,零極點類ZPK和頻率響應類FR。舉例:我們將通過一個例子來介紹類的構(gòu)造。在MATLAB語言使用手冊中給出了一個很有代表性的例子:多項式類的建立問題。假設我們想為多項式建立一個單獨的類,重新定

5、義加、減、乘及乘方等運算,并定義其顯示方式。那么建立一個類至少應該執(zhí)行下面的步驟:(這個例子更詳細的情況請參考MATLAB手冊)首先應該選定一個恰當?shù)拿郑邕@里的多項式類可選擇為polynom。以這個名字建立一個子目錄,目錄的名字前加。對本例來說,即應該在當前的工作目錄下建立polynom子目錄,而這個目錄無需在MATLAB路徑下再指定。編寫一個引導函數(shù),函數(shù)名應該和類同名。定義類的使用方法:functionp=polynom(a)ifnargin=0p.c=;p=class(p,polynom);elseifisa(a,polynom),p=a;else,p.c=a(:).;p=clas

6、s(p,polynom);end可以看出,本函數(shù)分三種情況加以考慮:如果不給輸入變量,則建立一個空的多項式;如果輸入變量a已經(jīng)為多項式類,則將它直接傳送給輸出變量p;如果a為向量,則將此向量變換成行向量,再構(gòu)造成一個多項式對象。如果想正確地顯示新定義的類,則必需首先定義display()函數(shù),并對新定義的類重新定義其基本運算。對多項式來說,我們可以如下定義有關的函數(shù):要改變顯示函數(shù)的定義,則需在此目錄下重新建立一個新函數(shù)display()。這種重新定義函數(shù)的方法又稱為函數(shù)的重載。顯示函數(shù)可以如下地重載定義。functiondisplay(p)disp();disp(inputname(1),=

7、)disp();disp(char(p);disp();注意,這里應該定義的是display()而不是disp()。從上面的定義可見,顯示函數(shù)要求重載定義char()函數(shù),用于把多項式轉(zhuǎn)換成可顯示的字符串。該函數(shù)的定義為functions=char(p)ifall(p.c=0),s=0;elsed=length(p.c)-1;s=;fora=p.c;ifa=0;ifisempty(s)ifa0,s=s,+;else,s=s,-;a=-a;endendifa=1|d=0,s=s,num2str(a);ifd0,s=s,*;endendifd=2,s=s,x,int2str(d);elseifd=

8、1,s=sx;endendd=d-1;end,end仔細研究此函數(shù),可以發(fā)現(xiàn),該函數(shù)能自動地按照多項式顯示的格式構(gòu)造字符串。比如,多項式各項用加減號連接,系數(shù)與算子之間用乘號連接,而算子的指數(shù)由表示。再配以顯示函數(shù),則可以將此多項式以字符串的形式顯示出來。雙精度處理:雙精度轉(zhuǎn)換函數(shù)的重載定義是很簡單的。functionc=double(p)c=p.c;加運算:兩個多項式相加,只需將其對應項系數(shù)相加即可。這樣,加法運算的重載定義可由下面的函數(shù)實現(xiàn)。注意,這里要對plus()函數(shù)進行重載定義。functionp=plus(a,b)a=polynom(a);b=polynom(b);k=length

9、(b.c)-length(a.c);p=polynom(zeros(1,k)a.c+zeros(1,-k)b.c);同理,還可以重載定義多項式的減法運算:functionp=minus(a,b)a=polynom(a);b=polynom(b);k=length(b.c)-length(a.c);p=polynom(zeros(1,k)a.c-zeros(1,-k)b.c);乘法運算:多項式的乘法實際上可以表示為系數(shù)向量的卷積,可以由conv()函數(shù)直接獲得。故可以如下重載定義多項式的乘法運算。functionp=mtimes(a,b)a=polynom(a);b=polynom(b);p=p

10、olynom(conv(a.c,b.c);乘方運算:多項式的乘方運算只限于正整數(shù)乘方的運算,其n次方相當于將該多項式自乘n次。若n=0,則結(jié)果為1。這樣我們就可以重載定義多項式的乘方運算為:functionp=mpower(a,n)ifn=0,n=floor(n);a=polynom(a);p=1;ifn=1,fori=1:n,p=p*a;endendelse,error(Powershouldbeanon-negativeinteger.)end多項式求值問題:可以對多項式求值函數(shù)polyval()進行重載定義。functiony=polyval(a,x)a=polynom(a);y=pol

11、yval(a.c,x);定義了此類之后,我們就可以方便地進行多項式處理了。例如我們可以建立兩個多項式對象P(s)=x3+4x2-7和Q(s)=5x4+3x3-1.5x2+7x+8其相應的MATLAB語句為P=polynom(1,4,0,-7),Q=polynom(5,3,-1.5,7,8)P=x3+4*x2-7Q=5*x4+3*x3-1.5*x2+7*x+8然后調(diào)用下面函數(shù)就可以得出相應的計算結(jié)果P+Qans=5*x4+4*x3+2.5*x2+7*x+1P-Qans=-5*x4-2*x3+5.5*x2-7*x-15P*Qans=5*x7+23*x6+10.5*x5-34*x4+15*x3+42

12、.5*x2-49*x-56X=P3X=x9+12*x8+48*x7+43*x6-168*x5-336*x4+147*x3+588*x2-343y=polyval(X,123456)y=-8491317561617715611036023243986977由于前面的重載定義,下面的表達式也能得出期望的結(jié)果P+123ans=x3+5*x2+2*x-4使用methods()函數(shù)可以列出一個新的類已經(jīng)定義的方法函數(shù)名。methods(polynom)Methodsforclasspolynom:chardoublempowerpluspolyvaldisplayminusmtimespolynom變量

13、的運算(1)MATLAB變量的代數(shù)運算如果給定兩個矩陣A和B,則我們可以用A+B,A-B,A*B可以立即得出其加、減和乘運算的結(jié)果。若這兩個矩陣數(shù)學上不可以這樣運算,則將得出錯誤信息,并終止正在運行的程序。在MATLAB下,如果A和B中有一個是標量,則可以無條件地進行這樣的運算。MATLAB不介意這些變量是純實數(shù)還是含有虛部的復數(shù)。矩陣的除法實際上就是線性方程的求解,如Ax=B這一線性方程的解即為x=inv(A)*B,或更簡單地x=AB。這又稱為矩陣的左除,而x=B/A稱為矩陣的右除。方陣的乘方可以由算符直接得出,如An。用MATLKAB這樣的語言,你可以輕易地算出A0.1,亦即A矩陣開10次

14、方得出的主根。矩陣的點運算也是相當重要的。所謂點運算即兩個矩陣相應元素的元素,如A.*B得出的是A和B對應元素的積,故一般情況下A*B不等于A.*B。矩陣的點乘又稱為其Hadamard積。點運算的概念又可以容易地用到點乘方上,例如A.2,A.A等都是可以接受的運算式子。Kronecker乘積是MATLAB在矩陣運算中的另一個有意義的問題,用kron(A,B)立即可以得出兩個矩陣的Kronecker乘積。(2)邏輯運算MATLAB并沒有單獨定義邏輯變量。在MATLAB中,數(shù)值只有0和“非0”的區(qū)分。非0往往被認為是邏輯真,或邏輯1。除了單獨兩個數(shù)值的邏輯運算外,還支持矩陣的邏輯運算,如A&B,A

15、|B,和A分別表示邏輯與、或、非的運算。例如,下面的A和B矩陣與運算將得出如下結(jié)果A=0234;1350;B=1053;1505;A&Bans=00111100(3)關系表達式與表達式函數(shù)MATLAB的大于、小于和等于等關系分別由、A=0234;1350;B=1053;1505;A=Bans=00001000確實使得A和B對應元素相等的位將返回1,否則返回0。MATLAB還可以用=和=這樣的符號來比較矩陣對應元素的大小。另外,MATLAB還提供了all()和any()兩個函數(shù)來對矩陣參數(shù)作邏輯判定。all()函數(shù)在其中變元全部非0時返回1,而any()函數(shù)在變元有非零元素返回1。find()函

16、數(shù)將返回邏輯關系全部滿足時的矩陣下標值,這個函數(shù)在編程中是相當常用。還可以使用isnan()類函數(shù)來判定矩陣中是否含有NaN型數(shù)據(jù)。如果有則返回這樣參數(shù)的下標。此類函數(shù)還有isfinite(),isclass(),ishandle()等。(4)其他運算MATLAB還支持其他運算,如取整、求余數(shù)等。可以使用rond)_,fix(),rem()等來實現(xiàn)。在實際編程中,在MATLAB下采用循環(huán)語句會降低其執(zhí)行速度,所以前面的程序可以由下面的命令來代替:i=1:100;mysum=sum(i)。在這一語句中,首先生成了一個向量i,然后用內(nèi)部函數(shù)sum()求出i向量的各個元素之和,或更簡單地,該語句還可

17、以寫成sum(1:100)。如果前面的100改成10000,再運行這一程序,則可以明顯地看出,后一種方法編寫的程序比前一種方法快得多。MATLAB并不要求循環(huán)點等間距,假設V為任意一個向量,則可以用fori=V來表示循環(huán)。同樣的問題在while循環(huán)結(jié)構(gòu)下可以表示為mysum=0;i=1;while(i1,error(Toomanyoutputarguments.);endifnargin=1,m=n;elseifnargin=0|nargin2error(Wrongnumberofiutputarguments.);endA1=zeros(n,m);fori=1:nforj=1:mA1(i,j

18、)=1/(i+j-1);end,endifnargout=1,A=A1;elseifnargout=0,disp(A1);end這樣規(guī)范編寫的函數(shù)用help命令可以顯示出其幫助信息:helpmyhilbMYHILBademonstrativeM-function.A=MYHILB(N,M)generatesanNbyMHilbertmatrixA.A=MYHILB(N)generatesanNbyNsquareHilbertmatrix.MYHILB(N,M)displaysONLYtheHilbertmatrix,butdonotreturnanymatrixbacktothecalling

19、function.Seealso:HILB.有了函數(shù)之后,可以采用下面的各種方法來調(diào)用它,并產(chǎn)生出所需的結(jié)果。A=myhilb(3,4)A=1.00000.50000.33330.25000.50000.33330.25000.20000.33330.25000.20000.1667A=myhilb(4)A=1.00000.50000.33330.25000.50000.33330.25000.20000.33330.25000.20000.16670.25000.20000.16670.1429myhilb(4)1.00000.50000.33330.25000.50000.33330.25

20、000.20000.33330.25000.20000.16670.25000.20000.16670.1429MATLAB工具箱編寫技巧放入一個目錄中的為某種目的專門編寫的一組MATLAB函數(shù)就可以組成一個工具箱。從某種意義上說,任何一個MATLAB語言的使用者都可以是工具箱的作者。在一個工具箱中,應該有一個名為Contents.m的文件,用來描述工具箱中所有MATLAB函數(shù)的名稱和意義。在該文件中第1行應該給出該工具箱的名稱,在第2行中給出該工具箱的版本與修改時間等信息。然后分類地給出該工具箱中各類函數(shù)的最基本功能。注意,本文件中所有的語句都應該是注釋語句,由百分號%引導,空行也應該由%引

21、導。另外,因為MATLAB是一種解釋性語言,所以即使在某個或某些函數(shù)中存在語法錯誤,但如果沒執(zhí)行到該語句時可能就不會發(fā)現(xiàn)該錯誤,這在一個成功的程序設計中是不能容許的。要查出某目錄中所有的M函數(shù)語法錯誤,首先應該用cd命令進入該目錄,然后運行pcode*命令進行偽代碼轉(zhuǎn)換。因為該命令會將MATLAB函數(shù)轉(zhuǎn)換成偽代碼,而在轉(zhuǎn)換過程中該程序?qū)⒆詣臃g每一條語句,所以一旦發(fā)現(xiàn)有語法錯誤,將會停止翻譯,給出錯誤信息。改正了該語法錯誤后,再重新執(zhí)行pcode命令,直到?jīng)]有錯誤為止。至少這樣會保證目錄下所有的程序不含有語法錯誤。Matlab的編程技巧盡量避免使用循環(huán):循環(huán)語句及循環(huán)體經(jīng)常被認為是MATLAB

22、編程的瓶頸問題。改進這樣的狀況有兩種方法:(1)盡量用向量化的運算來代替循環(huán)操作。我們將通過如下的例子來演示如何將一般的循環(huán)結(jié)構(gòu)轉(zhuǎn)換成向量化的語句。例3.19考慮下面無窮級數(shù)求和問題:如果我們只求出其中前有限項,比如100,000項之和(要精確地求出級數(shù)的和,無需求100000項,幾十項往往就能得出滿意的精度。這里主要是為了演示循環(huán)運算向量化的優(yōu)越性。),則可以采用下面的常規(guī)語句進行計算tic,s=0;fori=1:100000,s=s+(1/2i+1/3i);end,s,tocs=1.5000elapsed_time=1.9700如果采用向量化的方法,則可以得出下面結(jié)果??梢钥闯觯扇∠蛄炕?/p>

23、的方法比常規(guī)循環(huán)運算效率要高得多。tic,i=1:100000;s=sum(1./2.i+1./3.i),tocs=1.5000elapsed_time=0.3800(2)在必須使用多重循環(huán)的情況下,如果兩個循環(huán)執(zhí)行的次數(shù)不同,則建議在循環(huán)的外環(huán)執(zhí)行循環(huán)次數(shù)少的,內(nèi)環(huán)執(zhí)行循環(huán)次數(shù)多的。這樣也可以顯著提高速度。例3.20考慮生成一個5x10000的Hilbert長方矩陣,該矩陣的定義是其第i行第j列元素為h_i,j=1/(i+j-1)。我們可以由下面語句比較先進行i=1:5的循環(huán)和后進行該循環(huán)的耗時區(qū)別,其效果和前面分析的是一致的。ticfori=1:5forj=1:10000H(i,j)=1/(i+j-1);endendtocelapsed_time=8.6800tic,forj=1:10000fori=1:5J(i,j)=1/(i+j-1);endendtocelapsed_time=25.7000大型矩陣的預先定維給大型矩陣動態(tài)地定維是個很費時間的事。建議在定義大矩陣時,首先用MATLAB的內(nèi)在函數(shù),如zeros()或ones()對之先進行定維,然后再進行賦值處理,這樣會顯著減少所需的時間的。再考慮例3-20中的問題,如果輸入下面的

溫馨提示

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

評論

0/150

提交評論