




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
《計算機輔助分析》-MATLAB基礎(chǔ)與編程入門實驗指導(dǎo)書電子與電氣工程系
MATLAB實驗一:矩陣的使用一.實驗?zāi)康?掌握矩陣和數(shù)組的表示方法;2學(xué)會矩陣最常用的計算方法,能夠一般方程組的解。3掌握數(shù)組排序的規(guī)則4了解稀疏矩陣和多維數(shù)組二.實驗類型驗證型三.實驗內(nèi)容:1設(shè)置matlab的工作環(huán)境,將工作目錄設(shè)置為d:\work,添加搜索目錄d:\example課本P47練習(xí)32在matlab的命令窗口里完成如下計算,其中t的值分別取-1,0,1,表達(dá)式如下:3自行產(chǎn)生一個5行5列的數(shù)組,得到最中間的三行三列矩陣。(矩陣索引)4用magic產(chǎn)生一個5*5的矩陣,將這個矩陣的第二行與第三行互換位置5求方程組的根x1+4x2-3x3=22x1+5x2-x3=11key:[4;2;1]x1+6x2+x3=126已知:一個多項式的系數(shù)向量是p=[1-6-72-27],求這個多項式的根。7已經(jīng)兩個多項式的系數(shù)分別是:[1234]和[14916],請求這兩個多項式的乘積,及商和余數(shù)。8給定一個多項式的根是[-5-3+4i-3-4i],求原來的多項式9A157;625]用什么函數(shù),保證第一列排序的時候,其他列跟著變化。最后的結(jié)果是:[157;234;625]10利用fzero求這個方程x2sin(x)+cos(x)=0的一個根.11補充題:電路分析 電路分析常常涉及到對方程組的求解,這些方程常常是利用描述電流進入和離開節(jié)點的電流方程,或者描述電路中網(wǎng)絡(luò)回路上的電壓的電壓方程得出的。下圖描述了3個回路電壓的方程方程式如下:假設(shè)5個電阻值為已知,2個電壓值也為已知,求3個電流值。(這題同解方程不是一樣的嘛)12補充題:儀器可靠性(解釋) 如果知道了單個組件的可靠性,那么各個組件特定組合的可靠性就可以用兩種方法來確定。第一,可以用概率論和統(tǒng)計學(xué)的理論知識與結(jié)果來計算分析可靠性;第二,也可以開發(fā)一個計算機模擬系統(tǒng)對可靠性進行估計。本題假定單個組件的可靠性是0.8,使用隨機值對整個系統(tǒng)的可靠性進行模擬。四.實驗步驟:1.仔細(xì)閱讀Matlab幫助文件中有關(guān)以上函數(shù)的使用說明,能充分理解其使用方法并能運用它們完成實驗內(nèi)容。2建立工作目錄和搜索目錄見教材第一章相關(guān)內(nèi)容。參閱《matlab7.0從入門到精通》P7P17查看matlab7.0的搜索路徑選擇matlab主窗口中的“File—SetPath”菜單,或者在命令窗口輸入editpath,進入“設(shè)置搜索路徑”對話框。Addfolder即可在命令窗口輸入path,則會出現(xiàn)路徑名稱。3e是表示用exp表達(dá),圓周率用pi來表示。4訪問矩陣?yán)锏脑兀茫ǎ﹥?nèi)加上標(biāo)記來表達(dá),如果標(biāo)記是用逗號隔開的兩個數(shù),那么訪問的將是一個元素,如果標(biāo)記是用逗號隔開的兩個矩陣,將訪問得到一個子矩陣。5交換矩陣兩行的位置,原理和上面相同,關(guān)鍵就是要找到一個表達(dá)新順序的向量。6.根據(jù)AX=B可以得到方程組的解X。X可以用矩陣左除的方法,也可以用逆陣的方法。關(guān)鍵要搞清楚誰寫在前,誰先在后,用什么樣的符號。其中逆陣函數(shù)的寫法是inv()。7.先建立一個向量,將多項式的系數(shù)放到向量里去,然后再調(diào)用相應(yīng)的求根函數(shù),即可求出結(jié)果。參閱《精通Matlab7》P257多項式的根一個多項式是用多項式的系數(shù)行向量表示的,向量中的系數(shù)按照其所對應(yīng)的自變量的階次的降序進行排列。例如,多項式在matlab中將用下面的行向量表示:p=[1-12025116]注意,上面的多項式中自變量的二次方不存在,則需要在系數(shù)向量中的相應(yīng)元素位置上輸入0,來告訴matlab該階次的自變量不存在。當(dāng)利用系數(shù)行向量表示多項式后,利用函數(shù)roots求多項式的根。本例中輸入r=roots(p)則r=11.74732.7028-1.2251+1.4672i-1.2251-1.4672i如果知道一個多項式的根,能不能構(gòu)建相應(yīng)的多項式呢?可以函數(shù)為poly本例:pp=poly(r)則pp=1-12-1.7764e-01425116pp(abs(pp)<1e-12)=0%changesmallelementtozero!pp=1-120251168.建立兩個向量分別是A和B,將系數(shù)保存進去,調(diào)用相應(yīng)的多項式乘積函數(shù)conv,多項式相除函數(shù)deconv進行運算,要注意相除的時候的輸出參數(shù),其中一個參數(shù)是商,一個參數(shù)是余數(shù)。另外,提示,得到了多項式的系數(shù)之后,可以使用disp(poly2sym(p))函數(shù)來得到相應(yīng)的多項式。多項式的乘法實際上就是多項式系數(shù)向量之間的卷積運算,運用函數(shù)conv例如,我們要求兩個多項式和的乘積,可以采用下面的代碼結(jié)果c=162050758464即兩個多項式乘積的結(jié)果為多項式的加法如果是兩個多項式向量長度相等,則多項式加法就是將兩個多項式向量直接相加例如在上例中d=a+b則d=261220具體結(jié)果當(dāng)兩個多項式的階次不同時,其系數(shù)向量的長度也不同,這時需要先將低階多項式的系數(shù)向量前邊補0以便使它和高階多項式具有相同的長度,然后在執(zhí)行加法運算。如上例e=c+[000d]e=162052819684多項式除法運用函數(shù)deconv例如執(zhí)行多項式c除以多項式b[q,r]=deconv(c,b)Q是用來存儲相除后的商,r是余數(shù)9本題是多項式求根的還原,根據(jù)給定的根還原出原來的多項式。建立好根向量之后,可以調(diào)用poly函數(shù)來得到原多項式的系數(shù)。10對一個數(shù)組的第一列排序,可以得出第一列元素的順序和第一列原來元素在列中的序號,這個序號向量是非常重要的,以它作為索引數(shù)組,可以得到最后所要求的排序效果。因此,第一步要建立好原來的數(shù)組,然后選擇用[B,IX]=sort(...)這種方法對第一列進行排序,然后根據(jù)IX作為索引得到最后結(jié)果,可docsort查詢幫助,明確sort函數(shù)返回的兩個值的含義。數(shù)值的排序函數(shù)sort>>x=randperm(8)%newdatax=51374268>>xs=sort(x)%sortascendingbydefaultxs=12345678>>xs=sort(x,'ascend')%sortascendingxs=12345678>>[xs,idx]=sort(x)%returnsortindexaswellxs=12345678idx=26351748>>xs=sort(x,'descend')xs=87654321如果要排序的數(shù)組是一個二維數(shù)組,則sort函數(shù)只對改數(shù)組的列進行排序,注意是沒列都會排的。>>A=[randperm(6);randperm(6);randperm(6);randperm(6)]A=326514453621254613214356>>{As,idx]=sort(A)???{As,idx]=sort(A)|Error:Unbalancedormisusedparenthesesorbrackets.>>[As,idx]=sort(A)As=213311224513354624456656idx=342412413133124221231344如果只關(guān)心一列的排序問題,>>[tmp,idx]=sort(A(:,4))%sort4_thcolumnonlytmp=3566idx=4123>>As=A(idx.:)???As=A(idx.:)|Error:UnexpectedMATLABoperator.>>As=A(idx,:)%rearrangerowsinallcolumnsusingindexAs=214356326514453621254613>>As=sort(A,2)%按行排序As=123456123456123456123456>>As=sort(A,1)%同sort(A)As=213311224513354624456656>>本題解法>>A=[234;157;625]A=234157625>>[tmp,idx]=sort(A(:,1))tmp=126idx=213>>As=A(idx.:)???As=A(idx.:)|Error:UnexpectedMATLABoperator.>>As=A(idx,:)As=157234625降序就在后面加descend如[sdata,index]=sort(A,’descend’)sort(A,2,’descend’)11.如果求根的方程式不為多項式的形態(tài)就不能用roots函數(shù)。而這類的方程式多半是非線性方程式,其函數(shù)形態(tài)變化很大。對于解這類方程式的根,可以用fzero函數(shù),它其實是用來找一函數(shù)f(x)的x值代入時,會使該函數(shù)值為零(f(x)=0);而這也就是根的特性,因此我們可以用fzero求根。求任一方程式的根有三步驟:(1)先定義方程式。要注意必須將方程式安排成f(x)=0的形態(tài),例如一方程式為sin(x)+x=3,則該方程式應(yīng)表示為f(x)=sin(x)+x-3??梢訫-file函式定義方程式。(2)代入適當(dāng)范圍的x,y(x)值,將該函數(shù)的分布圖畫出,藉以了解該方程式的「長相。(3)由圖中決定y(x)在何處附近(x0)與x軸相交,以fzero的語法fzero('function',x0)即可求出在x0附近的根,其中function是先前已定義的函數(shù)名稱。如果從函數(shù)分布圖看出根不只一個,則須再代入另一個在根附近的x0,再求出下一個根。非線性方程數(shù)值求解函數(shù)fzeroz=fzero(‘fname’,x0,tol,trace)其中fname是待求根的函數(shù)文件名,x0為搜索的起點,一個函數(shù)可能有多個根,但fzero函數(shù)只給出離X0最近的那個根,tol控制結(jié)果的相對精度,缺省時取eps,trace指定迭代信息是否在運算時顯示,1為顯示,0為不顯示,缺省時為0例子求在x0=0.5附近的根>>z=fzero('x-10.^x+2',0.5)z=0.375812.提示先將方程組整理成以電流為未知數(shù)的三元一次方程組,帶入事先設(shè)定好的5個電阻和2個電壓值。得到AX=B的形式,然后通過左除或者求逆的方法得到方程組的解,也即是電流的值。13.首先,需要模擬單個組件的性能,如果一個組件的可靠性為0.8,那么它將在80%的時間內(nèi)正常工作,要模擬這個性能,可生成0-1之間的一個隨機值。如果值在0-0.8之間,就可假設(shè)這個組件是正常工作的,否則假設(shè)它失效。為了模擬3個組件的串行設(shè)計,我們生成3個0-1之間的隨機數(shù),如果所有3個數(shù)都小于或者等于0.8,那么這次試驗中該設(shè)計正常工作。3個一組,我們生成1000組數(shù)據(jù)來測試。a=rand(3,1000)pos=a<=0.8sum1=sum(pos)pos2=sum1==3sum(pos2)494/1000519 要估算組件可靠性為0.8的并行設(shè)計的可靠性,我們再次生成3個0-1之間的隨機浮點數(shù),如果3個數(shù)字中的任何一個小于或者等于0.8,那么此次試驗中該設(shè)計正常工作。a=rand(3,1000)pos=a<=0.8sum1=sum(pos)pos2=sum1>=1sum(pos2)995/1000992五.實驗報告要求:1實驗報告要在實驗時交上給老師審閱,無報告或者報告不者推遲本次實驗。2報告內(nèi)容分實驗前,實驗中,實驗后。實驗前報告撰寫內(nèi)容是:實驗題目和實驗解答。實驗中撰寫內(nèi)容是修改錯誤,進行注解,得到結(jié)果。實驗后,寫出實驗總結(jié)。格式如下:[實驗調(diào)試][實驗結(jié)果][實驗調(diào)試][實驗結(jié)果][實驗過程]1已知:A=[234;157;625]用什么函數(shù),保證第一列排序的時候,其他列跟著變化。最后的結(jié)果是:B=[157;234;625]解答:………[實驗調(diào)試][實驗結(jié)果][實驗調(diào)試][實驗結(jié)果]其中t的值分別取-1,0,1,表達(dá)式如下:解答:………[實驗總結(jié)][實驗自評]
MATLAB實驗二:元胞和結(jié)構(gòu)定義一.實驗?zāi)康?較熟練地掌握矩陣元素的訪問2進一步掌握矩陣中的關(guān)系運算的特點及索引地使用,分辨出元胞數(shù)組與結(jié)構(gòu)數(shù)組之區(qū)別,靈活地控制調(diào)用結(jié)構(gòu)體數(shù)組里元素。二.實驗類型設(shè)計型三.實驗內(nèi)容:1自行產(chǎn)生一個5行5列的數(shù)組,用兩種方法得到最中間的三行三行矩陣。2根據(jù)a=reshape(-4:4,3,3)做一個矩陣,然后(1)取出所有大于0的元素構(gòu)成一個向量(可推廣到從一個矩陣?yán)锖Y選出符合條件的元素組成一個向量)(2)將原矩陣中大于0的元素正常顯示,而小于等于0的元素全部用0來表示(可推廣到將原矩陣中不符合條件的全用0來表示,符合條件的值不變)。3建立如下一個元胞數(shù)組,現(xiàn)在要求計算第一個元胞第4行第2列加上第二個元胞+第三個元胞里的第二個元素+最后一個元胞的第二個元素。a={pascal(4),'hello';17.3500,7:2:100}4建立一個結(jié)構(gòu)體的數(shù)組,包括3個人,字段有姓名,年齡,分?jǐn)?shù),其中分?jǐn)?shù)由隨機函數(shù)產(chǎn)生一個3行10列的數(shù)據(jù)表示了有10門課程,每門課程有三個階段的分?jǐn)?shù)。問題是:問題1,如何找到第2個人的分?jǐn)?shù)并顯示出來問題2,如何找到第2個人的每門課程3個階段的平均分?jǐn)?shù)并顯示出來問題3,全班同學(xué)的10門課程的每門課程的平均分如何計算出來?要求放到一個數(shù)組里。問題4,找到這個班所有同學(xué)的姓名放到一個元胞數(shù)組里5給定一個圖像文件,格式是jpg,通過inportdata引入這個文件,查看引入后數(shù)據(jù)保存是一個數(shù)組,是100*100*3的一個數(shù)組,這是一個三維的數(shù)組,表明有100*100個點,每個點有RGB三個方面決定的?,F(xiàn)在,要求將這些點的中間部分30個象素寬度的正方型用黑點表示。(圖片是否保存在任何地方都可以調(diào)用啊,還是只能保存在work里面)6手動構(gòu)造一個長寬頁是1000*1000*3的圖像,每個圖像的點有三個0-255之間的隨機值構(gòu)成。然后使用image函數(shù)顯示這個圖像,再用imwrite函數(shù)保存這個圖像,使這個圖像用圖片瀏覽器也能夠查看。7將一個矩陣轉(zhuǎn)化成結(jié)構(gòu)體:有三個一維向量分別表示若干個點(5個點)的RGB值,如R=255*rand(1,5),G=255*rand(1,5),B=255*rand(1,5)。將這三個一維向量組成一個5*3矩陣(5表示5個點,3表示每個點有三個色值)。然后將這個表示若干點色值的矩陣轉(zhuǎn)化成元胞數(shù)組,最后將元胞數(shù)組轉(zhuǎn)成包含R,G,B三個屬性的結(jié)構(gòu)體。四.實驗步驟:1.仔細(xì)閱讀Matlab幫助文件中有關(guān)以上函數(shù)的使用說明,能充分理解其使用方法并能運用它們完成實驗內(nèi)容。2.先建立一個5*5的矩陣,然后可以通過使用索引訪問矩陣元素的多種方法中的訪問由指定的向量I,和向量J來指定。本題還可以通過空數(shù)組的方式來得到,空數(shù)組產(chǎn)生的主要目的就是為了刪除空間,我們可以先將這個5*5矩陣的第1,5行設(shè)置為空,再將第1,5列設(shè)置為空即可。3首先建立一個矩陣,然后用關(guān)系運算符找出大于0的索引矩陣,根據(jù)這個索引就可以得到滿足條件的矩陣了,第二個問題,是需要使用兩個數(shù)組的點積運算。參閱課本P101—P102例3-13和例3-14>>a=reshape(-4:4,3,3)a=-4-12-303-214>>b=zeros(3)b=000000000>>a>bans=001001011>>pos=a>bpos=001001011>>A=a(pos)A=1234>>A=zeros(3)A=000000000>>A=a(pos)A=1234>>A=conv(a,pos)???Errorusing==>convAandBmustbevectors.>>A=a.*posA=0020030144.元組數(shù)組的設(shè)置可以由多種方式,但總體來說,還是一個數(shù)組(矩陣,可看作是廣義矩陣),元組數(shù)組里的元素我們稱為元胞,要想訪問元胞里的元素,我們必須使用{},而不是(),元素里的部分內(nèi)容的訪問需要用到()。因此,本題先建立元胞數(shù)組,再訪問元胞元素里的分量,加起來即可。>>a={pascal(4),'hello';17.3500,7:2:100}a=[4x4double]'hello'[17.3500][1x47double]>>a1=a{1,1}(4,2)a1=4>>a2=a{2}a2=17.3500>>a3={3}(2)???a3={3}(2)|Error:Unbalancedormisusedparenthesesorbrackets.>>a3=a{3}(2)a3=e>>a4=a{4}(2)a4=9>>b=a1+a2+a3+a4b=131.35005.結(jié)構(gòu)體數(shù)組的建立方法有兩種,第一種是通過struct關(guān)鍵字來引導(dǎo)的建立方法,這種方法相當(dāng)于初始化賦值數(shù)據(jù),數(shù)據(jù)必須被{}包著,很象元胞元素;第二種是直接給某一個結(jié)構(gòu)體賦值,實際上是給它的某個屬性賦值,賦值的數(shù)據(jù)就是一般的數(shù)據(jù)格式。本題首先建立結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體里有三個字段,可以先建立student(1)的各個字段,然后再建立student(2),依次類推。(問,這些字段是我自己定義的嗎?)另外,在建立分?jǐn)?shù)字段的時候用到了rand函數(shù),用這個函數(shù)建立3行10列的矩陣,表示10門課程,每門課程有三次成績。問題1要得到某個人的成績,需要用()的方式訪問數(shù)組里某個人,然后再用“.”來操作其成員數(shù)據(jù)。問題2求每個人的平均分,需要用到mean函數(shù)。問題3要得到全班所有人(實際給出3個人),每個人10門平均分,有兩種方法:方法一,可以借助問題2的方法先求出第1個人的平均分,再求第2人的平均分,再求第3個人的平均分,然后用[a1;a2;a3]將平均分組合起來變成一個平均分矩陣,最后再求一次平均分即得到結(jié)果。方法二,就應(yīng)該預(yù)先建立一個3*10的矩陣meanss,這個矩陣預(yù)先都放0,注意矩陣的賦值方式:meanss(3,10)=0。然后,用循環(huán)的方式將求出來的第i個人的平均分交給矩陣meanss相應(yīng)的第i行。問題4,要將姓名放在一個矩陣?yán)铮袃煞N方法。第一種方法可以使用strvcat這個函數(shù)來將不同長度的字符串接合在一起,如names=strvcat(names,student(1).name)就接合了第一個人的姓名,用這種方法可以接合多個字符串,如果編程解決的話,只要使用循環(huán)即可完成任務(wù)。第二種方法,保存不同長度字符串使用元胞數(shù)組是非常方便的,因為不同的元胞元素結(jié)構(gòu)、長度等一切皆可不同。首先定義一個空元胞,例如names=cell(1),然后從結(jié)構(gòu)體里取出姓名依次放入元胞元素中去即可,格式如names{1}=第1個學(xué)生的姓名。若是編程來解決這個問題,思路也是一樣的,只不過,需要使用循環(huán)。>>student=struct{'name',{'A','B','C'},'age',{'12','13','11'},'score',rand(3,10)}???Undefinedvariable"struct"orclass"struct".>>student=struct('name',{'A','B','C'},'age',{'12','13','11'},'score',rand(3,10))student=1x3structarraywithfields:nameagescore>>student(2).nameans=B>>student(2).scoreans=Columns1through50.01530.93180.84620.67210.68130.74680.46600.52520.83810.37950.44510.41860.20260.01960.8318Columns6through100.50280.30460.68220.15090.86000.70950.18970.30280.69790.85370.42890.19340.54170.37840.5936>>student(2).ageans=13>>a2=mean(student(2).score)a2=Columns1through50.40240.60550.52470.51000.6309Columns6through100.54710.22920.50890.40900.7691>>a1=mean(student(1).score)a1=Columns1through50.40240.60550.52470.51000.6309Columns6through100.54710.22920.50890.40900.7691>>student(1).scoreans=Columns1through50.01530.93180.84620.67210.68130.74680.46600.52520.83810.37950.44510.41860.20260.01960.8318Columns6through100.50280.30460.68220.15090.86000.70950.18970.30280.69790.85370.42890.19340.54170.37840.5936>>a3=mean(student(3).score)a3=Columns1through50.40240.60550.52470.51000.6309Columns6through100.54710.22920.50890.40900.7691>>A=[a1;a2;a3]A=Columns1through50.40240.60550.52470.51000.63090.40240.60550.52470.51000.63090.40240.60550.52470.51000.6309Columns6through100.54710.22920.50890.40900.76910.54710.22920.50890.40900.76910.54710.22920.50890.40900.7691>>asum=mean(A)asum=Columns1through50.40240.60550.52470.51000.6309Columns6through100.54710.22920.50890.40900.7691>>B=[student(1).name,student(2).name,student(3).name]B=ABC6.一個圖像的引入是通過importdata來引入的,引入后發(fā)現(xiàn)是一個三維數(shù)組,其中每一頁上是紅、綠、蘭的顏色,根據(jù)要求,我們需要將這三頁中間區(qū)域全部改成黑色,黑色就是0,0,0的組合,我們只要找到相應(yīng)的行、列區(qū)域,將頁用“:”表示,全部設(shè)為0即可。7.本題的關(guān)鍵是如何設(shè)置這個1000*1000*3的三維數(shù)組,用隨機函數(shù)很容易生成,但要將隨機值改成0-255之間的整數(shù)才可以,可以用a=uint8(255*rand(10,10,3))這種方法來產(chǎn)生,顯示其內(nèi)容用image(a),因為這是顏色的范圍數(shù)據(jù)。將三維數(shù)組保存成圖像文件,我們使用imwrite函數(shù),比如說imwrite(a,'t1.jpg','jpg')就可以保存三維數(shù)組a到t1.jpg這個圖像文件中。8.在所有的數(shù)據(jù)類型中,只有元胞數(shù)組和結(jié)構(gòu)體類型最相似,因為它們都可以表示不相干的數(shù)據(jù),因此基于這點,系統(tǒng)提供了元胞數(shù)組和結(jié)構(gòu)體相互轉(zhuǎn)化的函數(shù)。本題要求將一個一般的矩陣轉(zhuǎn)成結(jié)構(gòu)體,思路是:一般矩陣元胞數(shù)組結(jié)構(gòu)體。而元胞轉(zhuǎn)結(jié)構(gòu)體要滿足一定的格式要求,這個格式如下: 字段名1(如R) 字段名2(如G) 字段名3(如B) 233 123 45243 88 185…根據(jù)給定的題目條件,有3個RGB的向量,R=255*rand(1,5)G=255*rand(1,5)B=255*rand(1,5)這三個向量是行向量。我們首先要把這3個向量整合成上表的模樣一般矩陣,以便于轉(zhuǎn)化得到的元胞滿足向結(jié)構(gòu)體轉(zhuǎn)化的條件。一般矩陣元胞數(shù)組轉(zhuǎn)化需要使用函數(shù)num2cell元胞數(shù)組結(jié)構(gòu)體轉(zhuǎn)化需要cell2struct,使用這個函數(shù),必須先定義一個字段名元胞fields={'red','green','blue'},這個元胞fields作為cell2struct函數(shù)的參數(shù)引入,以便于能夠分清楚,各列數(shù)據(jù)屬于哪個字段。>>R=255*rand(1,5)R=126.6209229.4411209.5154164.4521208.5835>>G=255*rand(1,5)G=168.358087.202573.880187.0044136.1901>>B=255*rand(1,5)B=185.413978.8690213.8165144.858594.4555>>A=[R;G;B]A=126.6209229.4411209.5154164.4521208.5835168.358087.202573.880187.0044136.1901185.413978.8690213.8165144.858594.4555>>A=[RGB]A=Columns1through5126.6209229.4411209.5154164.4521208.5835Columns6through10168.358087.202573.880187.0044136.1901Columns11through15185.413978.8690213.8165144.858594.4555>>A=[R;G;B]'A=126.6209168.3580185.4139229.441187.202578.8690209.515473.8801213.8165164.452187.0044144.8585208.5835136.190194.4555>>B=num2cell(A)B=[126.6209][168.3580][185.4139][229.4411][87.2025][78.8690][209.5154][73.8801][213.8165][164.4521][87.0044][144.8585][208.5835][136.1901][94.4555]>>fields={'red','green','blue'}fields='red''green''blue'>>C={fields,cell2struct(B)}???Errorusing==>cell2structNotenoughinputarguments.>>C=cell2struct(B)???Errorusing==>cell2structNotenoughinputarguments.>>C=struct('red',B(:,1),'green',B(:,2),'blue',B(:,3))C=5x1structarraywithfields:redgreenblue>>比對P126例3-341*2structarraywithfields可知這個結(jié)果是錯誤的結(jié)果顯示應(yīng)該為1*5structarraywithfields元胞和結(jié)構(gòu)體元胞——我們將其比作小區(qū)墻上一排排的郵箱來說明。這些郵箱的集合構(gòu)成了一個元胞,其中每一個郵箱就是這個元胞中的一個單元。每個郵箱中存放的物品不一樣,這相當(dāng)于每一個單元中所包含的數(shù)據(jù)類型或者數(shù)組維數(shù)是不同的。例如一個字符串或者一個多維數(shù)組等。每個郵箱都是用一個數(shù)字(如001)來標(biāo)識其地址的,同樣,元胞中的每一個單元也是用一個數(shù)字來索引的。當(dāng)我們向一個郵箱發(fā)送郵件時,需要明確指明該郵箱的號碼,同樣,當(dāng)用戶將數(shù)據(jù)加入到元胞中或者從元胞中提取數(shù)據(jù),也需要明確標(biāo)識出該單元的索引號。結(jié)構(gòu)體與元胞十分相似。唯一不同的地方在于結(jié)構(gòu)體中的數(shù)據(jù)存儲不是由數(shù)字來標(biāo)識的,而是由名稱來標(biāo)識的。仍用郵箱比方,郵箱的集合就是結(jié)構(gòu)體,每個郵箱相當(dāng)于結(jié)構(gòu)體中的一個結(jié)構(gòu)元素,只不過這時候郵箱是用其所有者的名字(如張三)標(biāo)識的,而不是數(shù)字代碼,當(dāng)我們向一個郵箱發(fā)送郵件時,需要明確指出接收郵件的郵箱名字(如張三),同樣,當(dāng)用戶將數(shù)據(jù)添加到一個特殊的結(jié)構(gòu)元素中,或從一個結(jié)構(gòu)元素中提取數(shù)據(jù)時,也需要標(biāo)識出該結(jié)構(gòu)元素的名稱。參見P123表3-13元胞結(jié)構(gòu)體創(chuàng)建使用運算符{},將不同類型和尺寸的數(shù)據(jù)組合在一起P115直接給字段賦具體數(shù)值,用“.”Cell使用創(chuàng)建空元胞數(shù)組P116StructP126使用的是()訪問A(1,2)A{1,2}A{1,2}(4)P118P127操作函數(shù)Cellfuncelldisp錯誤的為什么>>R=255*rand(1,5)R=179.1987139.3756113.4445177.1146158.4341>>G=255*rand(1,5)G=202.6794243.9951133.2605224.436344.1038>>B=255*rand(1,5)B=249.835569.219164.3440223.3142188.0130>>A=[R;G;B]A=179.1987139.3756113.4445177.1146158.4341202.6794243.9951133.2605224.436344.1038249.835569.219164.3440223.3142188.0130>>C=num2cell(A)C=[179.1987][139.3756][113.4445][177.1146][158.4341][202.6794][243.9951][133.2605][224.4363][44.1038][249.8355][69.2191][64.3440][223.3142][188.0130]>>D=cell2struct(C)???Errorusing==>cell2structNotenoughinputarguments.>>D=cell2struct('red',{C(1,:)},'green',{C(2,:)},'blue',{C(3,:)})???Errorusing==>cell2structToomanyinputarguments.>>D=cell2struct('red',C(1,:),'green',C(2,:),'blue',C(3,:))???Errorusing==>cell2structToomanyinputarguments.>>helpcell2structCELL2STRUCTConvertcellarraytostructurearray.S=CELL2STRUCT(C,FIELDS,DIM)convertsthecellarrayCintothestructureSbyfoldingthedimensionDIMofCintofieldsofS.SIZE(C,DIM)mustmatchthenumberoffieldnamesinFIELDS.FIELDScanbeacharacterarrayoracellarrayofstrings.Example:c={'tree',37.4,'birch'};f={'category','height','name'};s=cell2struct(c,f,2);Seealsostruct2cell,fieldnames.ReferencepageinHelpbrowserdoccell2struct>>fields={'red','green','blue'}fields='red''green''blue'>>D=cell2struct(fields,C)???Errorusing==>cell2structNumberoffieldnamesmustmatchnumberoffieldsinnewstructure.>>C=C'C=[179.1987][202.6794][249.8355][139.3756][243.9951][69.2191][113.4445][133.2605][64.3440][177.1146][224.4363][223.3142][158.4341][44.1038][188.0130]>>D=cell2struct(fields,C)???Errorusing==>cell2structNumberoffieldnamesmustmatchnumberoffieldsinnewstructure.>>C=C'C=[179.1987][139.3756][113.4445][177.1146][158.4341][202.6794][243.9951][133.2605][224.4363][44.1038][249.8355][69.2191][64.3440][223.3142][188.0130]>>D=cell2struct(C,fields,5)???Errorusing==>cell2structNumberoffieldnamesmustmatchnumberoffieldsinnewstructure.>>c={'tree',37.4,'birch'};f={'category','height','name'};s=cell2struct(c,f,2);>>c={'tree',37.4,'birch'};f={'category','height','name'};s=cell2struct(c,f,2)s=category:'tree'height:37.4000name:'birch'>>D=cell2struct(C,fields,3)???Errorusing==>cell2structNumberoffieldnamesmustmatchnumberoffieldsinnewstructure.>>D=cell2struct(C,fields,(3,6))???D=cell2struct(C,fields,(3,6))|Error:Expressionorstatementisincorrect--possiblyunbalanced(,{,or[.>>CC=[179.1987][139.3756][113.4445][177.1146][158.4341][202.6794][243.9951][133.2605][224.4363][44.1038][249.8355][69.2191][64.3440][223.3142][188.0130]>>fieldsfields='red''green''blue'>>D=cell2struct(C,fields,3)???Errorusing==>cell2structNumberoffieldnamesmustmatchnumberoffieldsinnewstructure.>>C=C'C=[179.1987][202.6794][249.8355][139.3756][243.9951][69.2191][113.4445][133.2605][64.3440][177.1146][224.4363][223.3142][158.4341][44.1038][188.0130]>>D=cell2struct(C,fields,3)???Errorusing==>cell2structNumberoffieldnamesmustmatchnumberoffieldsinnewstructure.>>C=C'C=[179.1987][139.3756][113.4445][177.1146][158.4341][202.6794][243.9951][133.2605][224.4363][44.1038][249.8355][69.2191][64.3440][223.3142][188.0130]>>D=cell2struct(C,fields,5)???Errorusing==>cell2structNumberoffieldnamesmustmatchnumberoffieldsinnewstructure.>>五.實驗報告要求:1實驗報告要在實驗時交上給老師審閱,無報告或者報告不者推遲本次實驗。2報告內(nèi)容分實驗前,實驗中,實驗后。實驗前報告撰寫內(nèi)容是:實驗題目和實驗解答。實驗中撰寫內(nèi)容是修改錯誤,進行注解,得到結(jié)果。實驗后,寫出實驗總結(jié)。具體格式見第一次實驗要求。
MATLAB實驗三:M文件編寫一.實驗?zāi)康?掌握MATLAB中M文件編寫的一般特點2掌握輸入與輸出參數(shù)的格式,對M文件的編譯有基本的認(rèn)識3對MATLAB與外部程序的接口方式有初步的了解二.實驗類型設(shè)計型三.實驗內(nèi)容:1給定一個矩陣a=123456編寫一個M函數(shù),要求輸入是a,輸出有三個:平均數(shù),標(biāo)準(zhǔn)差,秩。程序運行后分析其性能指標(biāo)(主要從時間上分析)2編寫一個M函數(shù),將一個給定圖片文件里的白色全部換成另一種顏色,比如說:將白色轉(zhuǎn)成黑色。3,4,5課本上有例子嗎?在什么地方?3要求編寫一個M函數(shù)文件,完成求三角函數(shù),x變化范圍從-pi到pi,求出相應(yīng)的y的值,并畫出圖,然后使用編譯器生成EXE,脫離MATLAB環(huán)境運行。4要求編寫一個MEX文件,完成將兩個矩陣的求和運算。5在matlab里編寫一個最簡單的M函數(shù),使用任何一種方法,將這個函數(shù)導(dǎo)出成dll文件,并在vc環(huán)境下使用dll文件里的函數(shù)。四.實驗步驟:1.仔細(xì)閱讀Matlab幫助文件中有關(guān)以上函數(shù)的使用說明,能充分理解其使用方法并能運用它們完成實驗內(nèi)容。2.首先輸入edit進入M文件編輯界面,然后輸入函數(shù),注意函數(shù)定義的格式。編寫函數(shù)的時候,要求根據(jù)數(shù)學(xué)公式來求平均數(shù),標(biāo)準(zhǔn)差。平均數(shù)的求法是求出列的總和后再除以列的長度;標(biāo)準(zhǔn)差(每列數(shù)據(jù)的標(biāo)準(zhǔn)差)是數(shù)的平方的平均數(shù)-均值的平方,得到的結(jié)果再來一個算術(shù)平方根。即公式如下:。最后是程序分析,我們需要啟動性能分析窗體,在runthiscode:里輸入需要在命令窗口里輸入的內(nèi)容,要注意輸入?yún)?shù)和輸出參數(shù)。程序:C:\\work\test>>x=[123;456]x=123456>>[avg,stdev,r]=test(x)avg=2.50003.50004.5000stdev=1.50001.50001.5000r=9.50800.7729其他的超鏈接點開也這樣,奇怪吧~2.可以用隨機函數(shù)rand產(chǎn)生一個三維數(shù)組img來表示一幅圖片,比如說10*10*3的大小,長寬各是10個象素點,接著,改變某幾個點為白色(白色要求rgb都是0),然后用imwrite(img,'t1.jpg','jpg')保存這個圖片,通過image(img)來查看圖片,這樣素材就有了。下面編寫程序來改變其中的白色部分,將白色改為黑色,即這個點的三個指標(biāo)全部是255。3.這個題目是實驗編譯器的使用。首先進入編輯界面,然后輸入函數(shù)。其中x就是一個行向量,根據(jù)x可以方便地得到相應(yīng)的y向量,使用plot函數(shù)即可以完成第一個任務(wù)。第二個任務(wù)是將這個函數(shù)文件編譯,需要用到編譯器mcc。第一步確定mcc是否安裝,一般默認(rèn)情況下是安裝好的,如果沒有安裝,請找到安裝目錄下的MCRInstaller.exe,運行它安裝;第二步進行編譯器的設(shè)置,mex-setup和mbuild–setup的配置。根據(jù)提示進行選擇使用VC編譯器;第三步,對剛才的M文件進行編譯,方法是通過參數(shù)m進行設(shè)置生成可執(zhí)行文件和相應(yīng)的一些文件,在M文件所有的目錄找到EXE文件,運行后看效果。參閱《matlab7.0從入門到精通》P500不管是想生成獨立的外部可執(zhí)行程序,或者是想創(chuàng)建一個C共享庫以及軟件組件,只要源碼是m文件,那么都可以借助編譯命令mcc來實現(xiàn)。基本格式mcc–mmyfun1、M文件3、包含繪圖命令的M文件M文件functionyychxux=-pi:pi;y=sin(x);plot(x,y);命令窗口:>>yychxu>>mcc-myychxuSelectacompiler:[1]LccCversion2.4.1[0]NoneCompiler:1Trytoupdateoptionsfile:C:\Users\ThinkPad\ApplicationData\MathWorks\MATLAB\R14SP3\compopts.batFromtemplate:C:\MATLAB71\BIN\WIN32\\..\win32\mbuildopts\lcccompp.batDone...-->""C:\MATLAB71\bin\win32\mwregsvr""C:\MATLAB71\bin\win32\mwcomutil.dll""Error:DllRegisterServerinC:\MATLAB71\bin\win32\mwcomutil.dllfailedUndefinedsubroutine&mexsetup::expirecalledatC:\MATLAB71/bin/mexsetup.pmline752.>>mcc-myychxu.m在…\work里找到應(yīng)用程序即可4.這個題目是實驗外部編寫程序擴展matlab的功能函數(shù)。編寫MEX文件一般可以直接在matlab里編寫,也可以在vc里編寫,如果程序比較小,可以直接在matlab里寫,在vc里寫要設(shè)置好環(huán)境。(1)先寫c程序。寫c程序,有兩點注意:第一點,必須包括頭文件mex.h,第二點就是寫mexFunction函數(shù),其格式如下void
mexFunction(int
nlhs,
mxArray
*plhs[],
int
nrhs,
const
mxArray
*prhs[])nlhs:輸出參數(shù)數(shù)目;plhs:指向輸出參數(shù)的指針數(shù)組
nrhs:輸入?yún)?shù)數(shù)目;prhs:指向輸入?yún)?shù)的指針數(shù)組比如看這樣的例子,將一個矩陣的所有元素加上10,變成一個新矩陣,程序代碼:#include"mex.h"voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[]){double*inData;double*outData;inti,j;intM,N;inData=mxGetPr(prhs[0]);M=mxGetM(prhs[0]);N=mxGetN(prhs[0]);plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL);//動態(tài)創(chuàng)建空間給輸出矩陣(結(jié)構(gòu)體指針)outData=mxGetPr(plhs[0]);//outData是矩陣的數(shù)據(jù)指針(數(shù)據(jù)指針)for(i=0;i<M;i++)for(j=0;j<N;j++)outData[j*M+i]=inData[j*M+i]+10;}//一定要注意,這個文件要保存成c文件,如保存成mextest.c(2)編譯生成mex文件mexmextest.c,查看目錄生成dll文件(3)在matlab里使用剛才編寫好的mex文件>>a=magic(3)>>b=mextest(a)第十五章應(yīng)用程序接口Mex從字面上是matlab和executable兩個單詞縮寫,一般mex文件使用C語言或者Fortran語言進行開發(fā),通過適當(dāng)?shù)木幾g后,生成的目標(biāo)文件能夠被M語言解釋器調(diào)用執(zhí)行,這種文件在MicrosoftWindows下使用后綴.dll5.這個題目是實驗vc與matlab的聯(lián)合編程,實際上就是將matlab的強大功能導(dǎo)出去,方法有5種:第一種是引擎技術(shù),第二種是直接使用matlab提供的一些數(shù)學(xué)庫函數(shù),第三種是使用編譯器生成的c代碼或者dll動態(tài)庫,第四種是使用com技術(shù),第五種是使用matcom??梢匀我膺x擇一種方法。比如說,使用vc來調(diào)用matcom.(1)打開matcom,文件名是huatu.m,編寫M文件如下:functionhuatu(m,n)x=m:0.1:n;y=sin(x);plot(x,y);(2)運行這個文件,在matcom的目錄debug會生成多個文件,其中.h.cpp這兩個文件是我們需要的。 huatu(-10,10)(3)打開vc,建立一個對話框項目matcomexample,將生成的huatu.h、huatu.cpp(默認(rèn)位置為安裝目錄:\matcom45\samples\Debug)和matlib.h、v4501v.lib(默認(rèn)位置為安裝目錄:\matcom45\lib)四個文件拷貝到建立的工程matcomexample目錄下。(4)將第四步拷貝的四個文件加入到VC工程中:工程->添加工程->文件,選擇剛才拷貝到matcomexample目錄下的四個文件。(5)為工程建立界面:添加一個Button按扭控件;添加二個Editbox控件,用于添加數(shù)據(jù);添加一個Statictext控件用于顯示圖形,將顯示圖形的Statictext的ID設(shè)置為ID_PIC。其他所有控件屬性保持默認(rèn)。在此文件上方添加兩個頭文件#include"matlib.h"#include"huatu.h",一定要注意順序,matlib.h要在前,huatu.h在后,因為huatu.h要用到matlib.h里的聲明。(6)按Ctrl+W為控件添加變量。如下所示: (7)程序代碼如下:voidCMatcomtestDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere doublea1,a2; Mmp1,p2; UpdateData(TRUE); initM(MATCOM_VERSION); a1=m_edit1; a2=m_edit2; CWnd*p=NULL; p=(CWnd*)GetDlgItem(ID_PIC); Mmplothandle=winaxes(p->m_hWnd); huatu(a1,a2); UpdateData(FALSE); exitM(); }(8)進行下列設(shè)置:工程->設(shè)置->C/C++選擇precompiledheaders選擇第一或第二項:自動選擇預(yù)補償頁眉(9)程序運行結(jié)果:五.實驗報告要求:1實驗報告要在實驗時交上給老師審閱,無報告或者報告不者推遲本次實驗。2報告內(nèi)容分實驗前,實驗中,實驗后。實驗前報告撰寫內(nèi)容是:實驗題目和實驗解答。實驗中撰寫內(nèi)容是修改錯誤,進行注解,得到結(jié)果。實驗后,寫出實驗總結(jié)。具體格式見第一次實驗要求。
MATLAB實驗四:文件的輸入與輸出一.實驗?zāi)康?較熟練掌握文本文件、MAT文件的讀寫方法2對二進制文件的讀寫有一定的了解,對于一些特殊的文件格式,比如圖像文件,聲音文件等會使用通用和專項的函數(shù)進行簡單的操作二.實驗類型設(shè)計型三.實驗內(nèi)容:1定義一個2*2的元胞數(shù)組,放入相應(yīng)的數(shù)據(jù),然后保存到MAT文件中,清除內(nèi)存后,然后再調(diào)入內(nèi)存。查看數(shù)據(jù)是否改變。(不會改變?。?實驗用圖像:pic.jpg.(注意,此圖片是灰度圖片,本題是針對灰度圖片的處理)使用imread函數(shù)將圖像讀入Matlab。根據(jù)產(chǎn)生灰度變換函數(shù)T1,使得:0.3r r<0.35d= 0.105+2.6333(r–0.35) 0.35≤r≤0.65 1+0.3(r–1) r>0.65 用T1對原圖像pic.jpg進行處理,查看結(jié)果。并打印出來。3自己查閱資料找出中國近10年人口數(shù),制成txt文件,格式如下:199011.3456199112.3566…然后將數(shù)據(jù)引入到內(nèi)存,并繪制出相應(yīng)的人口變化曲線圖。4使用通用讀函數(shù)importdata讀入一個聲音文件hello.wav,將所有的數(shù)據(jù)反序排列后,播放聲音,聽效果,最后,將數(shù)據(jù)保存成另外的的聲音文件名helloRev.wav。四.實驗步驟:1.仔細(xì)閱讀Matlab幫助文件中有關(guān)以上函數(shù)的使用說明,能充分理解其使用方法并能運用它們完成實驗內(nèi)容。2.可以先cell建立一個空元胞數(shù)組2*2,然后給相應(yīng)元素賦值,注意賦值的時候,有兩點注意:第一元胞元素的表示方法是用()來表示的,這點很正常,因為本質(zhì)上元胞數(shù)組是一個數(shù)組,第二賦值的一方必須用{}包起來表示一個元胞,而不能直接把矩陣或者向量或者字符串賦值過去。當(dāng)然,也可以一次性地生成一個2*2的元胞數(shù)組。保存成MAT文件就用一般的SAVA,調(diào)入的時候用LOAD即可。>>a=cell(2,2)a=[][][][]>>a(1)={'hello'}a='hello'[][][]>>a(2)={zeros(2,2)}a='hello'[][2x2double][]>>a(3)={17}a='hello'[17][2x2double][]3.先使用imread讀出圖片數(shù)據(jù)到變量sourImg,然后再用im2double轉(zhuǎn)換成雙精度數(shù)據(jù),得到新的變量r(因為處理時候按雙精度來處理,實際上得到的數(shù)就是原來的數(shù)除以255得到的小數(shù))。接著對這個r,使用給定的分段函數(shù)來處理得到要顯示的新圖像desIm
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025━2030年中國滾架項目投資可行性研究報告
- 2025年鈦酸鋯陶瓷材料項目合作計劃書
- 醫(yī)院感染培訓(xùn)
- 助產(chǎn)士溝通技巧-語言溝通技巧
- 2025年全腦開發(fā)項目發(fā)展計劃
- 膽管癌圍手術(shù)期的護理
- 2025年汽車座椅調(diào)角器項目發(fā)展計劃
- 2025年坦克玻璃系列項目建議書
- 中職高考數(shù)學(xué)二輪復(fù)習(xí)專項突破練習(xí)專題45 綜合練習(xí)10(含答案)
- 遞延所得稅培訓(xùn)
- 集裝箱碼頭的主要單證及其流轉(zhuǎn)概述課件
- 2022暖通空調(diào)第三版課后題答案
- HUW工法在深基坑圍護工程中的應(yīng)用
- DB37-T 4383-2021 混凝土結(jié)構(gòu)硅烷浸漬技術(shù)規(guī)程
- 甘肅省平?jīng)鍪懈骺h區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)及行政區(qū)劃代碼
- 2022年大夢杯福建省初中數(shù)學(xué)競賽試題參考答案及評分標(biāo)準(zhǔn)
- 邊坡開挖施工要求
- 數(shù)字圖像處理-6第六章圖像去噪課件
- 部編版六年級下冊語文教案(全冊)
- 2022年湖北成人學(xué)士學(xué)位英語真題及答案
- 公共場所健康證體檢表
評論
0/150
提交評論