第04章++MATLAB程序設(shè)計(jì)_第1頁(yè)
第04章++MATLAB程序設(shè)計(jì)_第2頁(yè)
第04章++MATLAB程序設(shè)計(jì)_第3頁(yè)
第04章++MATLAB程序設(shè)計(jì)_第4頁(yè)
第04章++MATLAB程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩79頁(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)介

第4章MATLAB

程序設(shè)計(jì)陳文靜主要內(nèi)容M文件的建立、分類程序控制結(jié)構(gòu)函數(shù)的設(shè)計(jì)(參數(shù)控制,注釋等)程序的調(diào)試(包括函數(shù)文件的調(diào)試)程序按照矩陣規(guī)則進(jìn)行優(yōu)化4.1M文件M文件:由代碼(指令)組成,在MATLAB系統(tǒng)中解釋運(yùn)行。M文件的后綴名為M。

M文件的分類

(1)命令式文件(腳本script)。(2)函數(shù)式文件(function)。4.1M文件兩類文件的區(qū)別命令式文件沒(méi)有輸入輸出參量,函數(shù)式文件帶帶參數(shù)。命令式文件運(yùn)行中可以調(diào)用工作空間的數(shù)據(jù),運(yùn)行中產(chǎn)生的所有變量為全局變量。函數(shù)式文件不能調(diào)用工作空間的數(shù)據(jù),運(yùn)行中產(chǎn)生的所有變量為局部變量。命令式文件可以直接運(yùn)行,函數(shù)式文件不能,只能調(diào)用。4.1M文件函數(shù)式文件(function)的構(gòu)成

函數(shù)式文件(function)的構(gòu)成function[w1,w2]=set_filter_w(I,kk)%設(shè)置濾波窗ifnargin<2kk=1;end……4.1M文件M文件的建立與打開(kāi)可用任何文本編輯程序來(lái)建立和編輯常用matlab提供的編輯器建立/打開(kāi)的方式:

a、主菜單

b、運(yùn)行edit命令

c、命令按鈕,Newscript4.1M文件4.2程序控制結(jié)構(gòu)三種程序控制結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)4.2程序控制結(jié)構(gòu)順序結(jié)構(gòu)指按照程序中語(yǔ)句的排列順序依次運(yùn)行,直道程序的最后一句。一般涉及數(shù)據(jù)的輸入、數(shù)據(jù)的計(jì)算或處理、數(shù)據(jù)的輸出等。Clearall;clc;closeall;input(prompt)strResponse=input(prompt,'s')disp(x)4.2程序控制結(jié)構(gòu)name='Alice';age=12;str=sprintf('%swillbe%dthisyear.',name,age);disp(str);A='Alice';age=12;str=fprintf('%swillbe%dthisyear.\n',name,age);Alicewillbe12thisyear.4.2程序控制結(jié)構(gòu)Matlab與日期和時(shí)間有關(guān)的函數(shù)calendarX=clockY=todayT=tictocetimenowdate

datenumpausepause(3)延時(shí)3秒ctrl+c(終止程序運(yùn)行)順序結(jié)構(gòu)實(shí)例例:求一元二次方程ax2+bx+c=0的根,其中a,b,c的值由鍵盤輸入。

a=input(‘a(chǎn)=?’);b=input(‘b=?’);c=input(‘c=?’);x1=(-b+sqrt(b.^2-4*a*c))/(2*a);x2=(-b-sqrt(b.^2-4*a*c))/(2*a);

disp([‘x1=‘,num2str(x1),‘x2=‘,num2str(x2)])或p=[abc];x=roots(p)4.2程序控制結(jié)構(gòu)三種程序控制結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)4.2程序控制結(jié)構(gòu)if結(jié)構(gòu)1)單分支If結(jié)構(gòu)2)雙分支If結(jié)構(gòu)if-else-end3)多分支If結(jié)構(gòu)If…elseif…else…endswith結(jié)構(gòu)

try結(jié)構(gòu)

選擇結(jié)構(gòu)4.2程序控制結(jié)構(gòu)1)單分支ifif條件語(yǔ)句組

end

if結(jié)構(gòu)2)雙分支ifif條件語(yǔ)句組1else語(yǔ)句組2end3)多分支ifif條件1語(yǔ)句組1elseif條件2語(yǔ)句組2……elseif條件m語(yǔ)句組melse語(yǔ)句組nend例:計(jì)算分段函數(shù):例:多分支條件語(yǔ)句例、輸入一個(gè)字符,若為大寫字母,則輸出其對(duì)應(yīng)的小寫字母;若為小寫字母,則輸出其對(duì)應(yīng)的大寫字母;若為數(shù)字字符,則輸出其對(duì)應(yīng)的數(shù)值,其它為原樣輸出。disp(abs(c)-abs(‘0’))switch語(yǔ)句switch表達(dá)式

case表達(dá)式1

語(yǔ)句組1case表達(dá)式2

語(yǔ)句組2………

case表達(dá)式m

語(yǔ)句組motherwise

語(yǔ)句nend4.2程序控制結(jié)構(gòu)選擇結(jié)構(gòu)switch語(yǔ)句switch表達(dá)式

case表達(dá)式1

語(yǔ)句組1case{表達(dá)式2,表達(dá)式3,…表達(dá)式m}

語(yǔ)句組2….otherwise

語(yǔ)句nend4.2程序控制結(jié)構(gòu)選擇結(jié)構(gòu)4.2程序控制結(jié)構(gòu)…switch(result)case52disp('resultis52')case{53,78}disp('resultis52or78')End例使用switch語(yǔ)句判斷鍵盤輸入值并做出相應(yīng)提示。例使用switch語(yǔ)句對(duì)顧客購(gòu)買的商品進(jìn)行打折銷售try語(yǔ)句try

語(yǔ)句組1catch

語(yǔ)句組2end例、矩陣乘法的規(guī)則,先求兩矩陣的乘積,若出錯(cuò)則自動(dòng)轉(zhuǎn)去求兩矩陣的點(diǎn)積。A=[1,2,3;4,5,6];B=[7,8,9;10,11,12];tryC=A*B;catchC=A.*B;end4.2程序控制結(jié)構(gòu)試探結(jié)構(gòu)Errorusing*Innermatrixdimensionsmustagree.

4.2程序控制結(jié)構(gòu)三種程序控制結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)硬循環(huán)語(yǔ)句(for……end)條件循環(huán)語(yǔ)句(while…….end)4.2程序控制結(jié)構(gòu)

for循環(huán)變量=表達(dá)式1:表達(dá)式2:表達(dá)式3

循環(huán)體語(yǔ)句

end例、利用循環(huán)語(yǔ)句生成方波A,要求方波序列長(zhǎng)度為100,方波個(gè)數(shù)為10個(gè)。A0=[0,0,0,0,0,1,1,1,1,1];A=[];fori=1:10A=[AA0];endfor循環(huán)結(jié)構(gòu)[B1,B]=meshgrid(A0);C=reshape(B,1,100);for循環(huán)結(jié)構(gòu)Fori=valArray…endfors=[1,5,8,17]disp(s)end15817a=[1,3,5,7];>>fori=as(i)=i;ends=1030507例:輸出100~999之間的水仙花數(shù)例:編寫程序,求Fibnacci數(shù)列各項(xiàng)求:n=input(‘n=‘);

y=0;fori=1:ny=y+1/i.^2;enddisp(y)n=input(‘n=‘);

x=1:n;y=1./i.^2sum(y)disp(y)例:求定積分設(shè)求例:求定積分設(shè)求quad(fun,a,b)>>F=@(x)exp(-0.5*x).*sin(x+pi/6);>>Q=quad(F,0,3*pi)Q=0.9008條件循環(huán)語(yǔ)句(while-end)當(dāng)--就—

結(jié)構(gòu)while條件循環(huán)體語(yǔ)句

endWhile循環(huán)結(jié)構(gòu)條件循環(huán)體語(yǔ)句YNWhile循環(huán)例:求階乘大于或等于99^99的最小整數(shù)。N=1;while(prod(1:N)<99^99)N=N+1;endm=1;while(sum(1:N)<=10000)m=m+1;end>>mm=141求:

例:從鍵盤輸入若干個(gè)數(shù),當(dāng)輸入0時(shí),結(jié)束。求這些數(shù)的和與平均值While循環(huán)例break用于終止循環(huán)的執(zhí)行,即程序?qū)⑻鲅h(huán)。continue

控制跳出循環(huán)體中的某些語(yǔ)句,即跳過(guò)循環(huán)體中所有剩下的語(yǔ)句,繼續(xù)下一次循環(huán)。例、求[100,200]之間第一個(gè)能被21整除的數(shù)forn=100:200ifrem(n,21)~=0continueendbreakend終止循環(huán)forn=100:200ifrem(n,21)==0breakendendx=100:200;a=find(rem(x,21)==0,1);x(a)return使正在執(zhí)行的函數(shù)正常退出??梢杂糜谡:蛷?qiáng)制結(jié)束函數(shù)的運(yùn)行例、求[100,200]之間第一個(gè)能被21整除的數(shù)forn=100:200ifrem(n,21)==0returnendend[x,y]=meshgrid(1:256);z=2-((x-128).^2+(y-128).^2)/128^2;mesh(z);

a=z;a(a<=1)=NaN;[M,N]=size(a);fori=1:Mforj=1:Nifa(i,j)<=1a(i,j)=NaN;endendend循環(huán)的嵌套例:找出1:100之間的全部素?cái)?shù)clearallclcN=100;p=2:N;fori=2:sqrt(N)n=find(rem(p,i)==0&p~=i);p(n)=[];enddisp(p)例:找出1:100之間的全部素?cái)?shù)寫出下列程序的輸出結(jié)果s=0;a=[12,13,14;15,16,17;181920;21,22,23]fork=aforj=1:4ifrem(k(j),2)~=0s=s+k(j);endendends=108第三節(jié)函數(shù)文件函數(shù)文件的基本結(jié)構(gòu)Function[輸出參量]=函數(shù)名(輸入?yún)⒘?

注釋說(shuō)明函數(shù)體語(yǔ)句說(shuō)明:1、函數(shù)調(diào)用時(shí),不是函數(shù)名而是函數(shù)文件名。2、注釋用%開(kāi)頭,第一注釋行及之后的連續(xù)行3、return

函數(shù)文件的基本結(jié)構(gòu)Function[輸出參量]=函數(shù)名(輸入?yún)⒘?

注釋說(shuō)明函數(shù)體語(yǔ)句說(shuō)明:1、函數(shù)調(diào)用時(shí),不是函數(shù)名而是函數(shù)文件名。2、注釋用%開(kāi)頭,第一注釋行及之后的連續(xù)行3、return第三節(jié)函數(shù)文件

函數(shù)調(diào)用:普通調(diào)用[輸出參量]=函數(shù)名(輸入?yún)⒘?function[rho,theta]=tran(x,y)rho=sqrt(x*x+y*y);theta=atan(y/x);調(diào)用:

[rho,the]=tran(x,y);第三節(jié)函數(shù)文件functionA=myhilb(m,n)ifnargout>1,error(‘Toomanyoutputargument’);endifnargin==1,n=m;elseifnargin==0|nargin>2,error(‘wrongnumberofinputargument’);endfori=1:mforj=1:nA(i,j)=1/(i+j-1);endend第三節(jié)函數(shù)文件調(diào)用:

A=myhilb(3,4);

函數(shù)調(diào)用:嵌套調(diào)用函數(shù)可以嵌套調(diào)用,如遞歸例、利用函數(shù)的遞歸調(diào)用,求n的階乘。functionf=myfactor(n)ifn<=1f=1;elsef=myfactor(n-1)*n;end第三節(jié)函數(shù)文件函數(shù)調(diào)用舉例用for循環(huán)編程實(shí)現(xiàn)對(duì)行向量進(jìn)行任意重新排列。建立函數(shù):myrndprm調(diào)用myrndprm>>x=1:10;>>y=myrndprm(x)y=46513278910

函數(shù)參數(shù)的可調(diào)性

nargin:numberoffunctioninputarguments

nargout:numberoffunctionoutputarguments

全局變量與局部變量

global變量名子函數(shù)私有函數(shù)

private目錄下嵌套函數(shù)第三節(jié)函數(shù)文件nargin和nargout

調(diào)節(jié)輸入和輸出參數(shù),一個(gè)函數(shù)可完成多種功能。functionfout=charry(a,b,c);Ifnargin==1fout=a;elseifnargin==2fout=a+b;elseifnargin==3fout=(a*b*c)/2;end函數(shù)參數(shù)的可調(diào)性global變量名缺點(diǎn):破壞了函數(shù)對(duì)變量的封裝,降低了程序的可讀性。functionf=wadd(x,y)globalalphabetaf=alpha*x+beta*y;運(yùn)行時(shí)

globalalphabetaalpha=1;beta=2;s=wadd(1,2);全局變量與局部變量子函數(shù)(subfunction)一個(gè)M文件可以包括多個(gè)函數(shù)第一個(gè)出現(xiàn)的主函數(shù),其它的為子函數(shù)主函數(shù)可以在M文件的外部調(diào)用子函數(shù)只能被主函數(shù)和同一個(gè)M文件中的其它子函數(shù)調(diào)用因此,主函數(shù)必須在最上方,子函數(shù)的排列順序可以任意子函數(shù)function[avg,med]=mystate(u)n=length(u);avg=mean(u,n);med=median(u,n);functiona=mean(v,n)a=sum(v)/n;functionm=median(v,n)w=sort(v);ifrem(n,2)==1m=w((n+1)/2);elsem=(w(n/2)+w(n/2+1))/2;end嵌套函數(shù)嵌套:在函數(shù)內(nèi)部定義其它函數(shù)嵌套函數(shù)必須用end結(jié)尾functiontestfunclc;x=5;y=testfun1(x);functionz=testfun1(x)z=2*x;endyend1.語(yǔ)法錯(cuò)誤2.邏輯錯(cuò)誤(編程失誤)調(diào)式方法:(1)命令行,單獨(dú)運(yùn)行部分命令,根據(jù)結(jié)果判斷。(2)設(shè)置斷點(diǎn)來(lái)判斷(3)

return的靈活應(yīng)用第四節(jié)程序調(diào)試

1.語(yǔ)法錯(cuò)誤

能很好判斷或檢查出語(yǔ)法錯(cuò)誤

2.邏輯錯(cuò)誤(編程失誤)

matlab基本不能檢查到邏輯錯(cuò)誤第四節(jié)程序調(diào)試2.邏輯錯(cuò)誤(編程失誤)(1)命令行,單獨(dú)運(yùn)行部分命令,根據(jù)結(jié)果判斷。(2)設(shè)置斷點(diǎn)來(lái)判斷_debug

k>>變量名,查看。變量的鼠標(biāo)觀測(cè)法(3)利用鍵盤控制,如命令pause\keyboard\return第四節(jié)程序調(diào)試Debug詳解Debug工具欄中部分子項(xiàng)的功能1、step

執(zhí)行M文件的當(dāng)前行,即單步執(zhí)行2、stepin

如果當(dāng)前行調(diào)用了另外一個(gè)函數(shù),則深入被調(diào)用的函數(shù)內(nèi)部執(zhí)行3、stepout

在當(dāng)前函數(shù)內(nèi)部,完成剩余行的執(zhí)行,并退出函數(shù)4、continue

完成當(dāng)前M文件的運(yùn)行5、exitdebugmodemy_demo_func(1:64)4.3.5子函數(shù)4.3.5子函數(shù)第一步第二步第三步第四步第五步1.代碼運(yùn)行的計(jì)時(shí)方法整段程序代碼的計(jì)時(shí)計(jì)算tic與toc之間的時(shí)間。也可以用etime(t1,t2)

計(jì)算t1,t2之間的時(shí)間差來(lái)完成上述功能。也可以用cputime變量來(lái)完成上述功能。五、程序的優(yōu)化設(shè)計(jì)1.代碼運(yùn)行的計(jì)時(shí)方法整段程序代碼的計(jì)時(shí)計(jì)算tic與toc之間的時(shí)間。

tic……toc五、程序的優(yōu)化設(shè)計(jì)1.代碼運(yùn)行的計(jì)時(shí)方法也可以用etime(t1,t2)

計(jì)算t1,t2之間的時(shí)間差來(lái)完成上述功能。t=clock;fft(x);etime(clock,t)五、程序的優(yōu)化設(shè)計(jì)1.代碼運(yùn)行的計(jì)時(shí)方法也可以用cputime變量來(lái)完成上述功能。

t=cputime;your_operation;cputime-t五、程序的優(yōu)化設(shè)計(jì)編程技巧(1)盡量避免使用循環(huán)。盡量使用向量化的運(yùn)算。多重循環(huán),次數(shù)多的循環(huán)在內(nèi)。(2)矩陣維數(shù)預(yù)先定義。(3)優(yōu)先考慮內(nèi)置函數(shù)。(4)算法的優(yōu)化。作業(yè)1、編寫函數(shù),應(yīng)用cos(x)的麥克勞林展開(kāi)式,計(jì)算cos(x)的值,并將計(jì)算結(jié)果于matlab自帶的cos函數(shù)進(jìn)行比較。提示采用while…end條件循環(huán)。2、產(chǎn)生20個(gè)隨機(jī)整數(shù),輸出其中小于平均值的偶數(shù)。3、按照循環(huán)結(jié)構(gòu)計(jì)算s=1+2+22+…2n4、編寫函數(shù)文件,用于求兩個(gè)矩陣的乘積和點(diǎn)積,要求若能同時(shí)進(jìn)行矩陣乘和點(diǎn)積,則輸出兩個(gè)值。例,產(chǎn)生方波A,要求方波序列長(zhǎng)度為100,方波個(gè)數(shù)為10個(gè)。

A=[0,0,0,0,0,1,1,1,1,1];B=[A,A,A,A,A,A,A,A,A,A];或[B1,B]=meshgrid(A);C=reshape(B,1,100);

在matlab中,矩陣元素按列存儲(chǔ),即首先存儲(chǔ)矩陣的第一列元素,然后存儲(chǔ)第二列,…,reshape只是改變?cè)仃嚨男袛?shù)和列數(shù),不改變矩陣個(gè)數(shù)及原來(lái)的存儲(chǔ)結(jié)構(gòu)練習(xí)1.從鍵盤上輸入4位數(shù),按照下列規(guī)則加密輸出:每位數(shù)字都加上7,然后用和除以1

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論