綜合訓練-稀疏矩陣運算器(完整版)實用資料_第1頁
綜合訓練-稀疏矩陣運算器(完整版)實用資料_第2頁
綜合訓練-稀疏矩陣運算器(完整版)實用資料_第3頁
綜合訓練-稀疏矩陣運算器(完整版)實用資料_第4頁
綜合訓練-稀疏矩陣運算器(完整版)實用資料_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

綜合訓練稀疏矩陣運算器(完整版)實用資料(可以直接使用,可編輯完整版實用資料,歡迎下載)

《數(shù)據(jù)結(jié)構(gòu)》綜合訓練稀疏矩陣運算器(完整版)實用資料(可以直接使用,可編輯完整版實用資料,歡迎下載)綜合訓練報告理學院課程設計報告參考格式一、題目:稀疏矩陣運算器二、目的和要求:使學生掌握稀疏矩陣的存儲方法及其運算。要求利用C++語言實現(xiàn)一個能實現(xiàn)稀疏矩陣簡單運算的程序。具體要求如下:1、采用順序存儲方式。2、提供稀疏矩陣的輸入功能。輸入方式可以采用三元組方式,也可采用用戶直接輸入方式等。3、實現(xiàn)稀疏矩陣的轉(zhuǎn)置功能??梢詫⒂脩糨斎氲南∈杈仃囘M行轉(zhuǎn)置,并將轉(zhuǎn)置后的稀疏矩陣顯示到屏幕。4、稀疏矩陣的加法運算功能。提供用戶連續(xù)輸入兩個稀疏矩陣的功能,并能將所求的兩個稀疏矩陣的和顯示出來。5、稀疏矩陣的乘法運算功能。提供用戶連續(xù)輸入兩個稀疏矩陣的功能,并能將所求的兩個稀疏矩陣的和顯示出來。6、稀疏矩陣輸出要求輸出為完整形式。三、概要設計:稀疏矩陣的順序儲存結(jié)構(gòu),就是對其相應的三元組線性表進行順序存儲。每個非零元素的三元組用如下結(jié)構(gòu)定義:structTriple{introw,col;ElemTypeval;};其中,row和col用來分別存儲元素的行號和列號,val用來存儲元素值。一個稀疏矩陣的順序存儲類型定義如下。structSMatrix{intm,n,t;Triplesm[maxterms+1];};其中,m、n和t分別用來存儲稀疏矩陣的行數(shù)、列數(shù)和非零元素的個數(shù),sm數(shù)組用來順序存儲每個三元組元素。稀疏矩陣的加法、減法、數(shù)乘和乘法模塊調(diào)用了稀疏矩陣的初始化和輸出函數(shù)。四、算法描述:1.稀疏矩陣的輸入(1)首先把形參m,n傳遞給稀疏矩陣的行數(shù)和列數(shù),確定稀疏矩陣的規(guī)模。(2)定義整型變量row,col,val分別用來存儲三元組的行號、列號和元素值,定義整型變量k表示第k個三元組元素,其中k初值為零。(3)定義一個while循環(huán),k自加,然后把每次輸入的row,col,val的值分別賦值給第k個三元組元素的行號、列號和元素值。(4)當輸入完所有的三元組后,以輸入特殊的三元組(0,0,0)結(jié)束整個輸入過程,并且把k的值賦值給稀疏矩陣非零元素的個數(shù)。2.稀疏矩陣的輸出(1)定義一個二重for循環(huán)來輸出稀疏矩陣每一行,每一列的元素。(2)在二重for循環(huán)中再定義一個for循環(huán)來判斷每一個非零元素。(3)如果這個非零元素的行號和列號分別與這個二重循環(huán)的行數(shù)和列數(shù)相等,那么就輸出這個非零元素的值。否則,就輸出零。3.稀疏矩陣的快速轉(zhuǎn)置方法(1)首先把稀疏矩陣的行數(shù)、列數(shù)和非零元素的個數(shù)m,n,t賦值給轉(zhuǎn)置矩陣的列數(shù)、行數(shù)和非零元數(shù)的個數(shù)。(2)如果這個矩陣是零矩陣(即非零元素的個數(shù)為零的矩陣),那么轉(zhuǎn)換完畢返回。否則,為num和pot向量動態(tài)分配存儲空間。然后對num向量進行初始化,置每個分量為0.(3)第1遍掃描數(shù)組M.sm,統(tǒng)計出每一列(即轉(zhuǎn)換后的每一行)非零元素的個數(shù)。(4)計算每一列(即轉(zhuǎn)換后的每一行)的第1個非零元素在S.sm中存儲位置。(5)對M.sm進行第2遍掃描,把每個元素行、列值互換寫入到S.sm的確定位置。(6)刪除動態(tài)分配的數(shù)組,返回轉(zhuǎn)置矩陣。4.稀疏矩陣的加法運算(方法1)(1)如果兩個矩陣尺寸不同,就給出錯誤信息。(2)否則,把這兩個稀疏矩陣線性表上下排列形成一個新的線性表。(3)做一個循環(huán),把這個線性表中具有相同行號和相同列號的元素進行相加,并進行判斷。(4)如果相加的結(jié)果不為零,那么就把行號、列號和這個值賦值給一個新線性表的三元組的行號、列號和元素值,并且非零元素個數(shù)自加。(5)最后,把原來矩陣的尺寸復制給這個新的線性表的規(guī)模。那么這個線性表即為所求,輸出這個線性表。5.稀疏矩陣的加法運算(方法2)(1)如果兩個矩陣尺寸不同,就給出錯誤信息。(2)否則,定義一個while循環(huán),一直循環(huán)到兩個稀疏矩陣線性表中的某一個線性表掃描完畢。(3)判斷兩個線性表中的兩個三元組的行號是否相等,如果不相等,就把行號較小的那個三元組傳遞給一個新的線性表,把較大的三元組在與另一個線性表的下一個三元組再進行比較。(4)如果行號相等的話,再判斷兩個三元組的列號是否相等。如果不相等,就把列號較小的那個三元組傳遞給那個新的線性表,把較大的三元組在與另一個線性表的下一個三元組再進行比較。(5)如果列號相等的話,就把兩個三元組的元素值相加。(6)如果相加的值不為零,就把這個值賦值給新線性表的一個新的三元組的元素值。把三元組的行號和列號也依次賦值給新三元組的行號和列號。(7)如果相加的值為零,就再比較兩個線性表的下一個三元組。(8)當這個while循環(huán)循環(huán)完畢后,把另一個線性表的剩余元素依次傳遞給那個新的線性表。(9)這個新的線性表即為所求,輸出這個新的稀疏矩陣。6.稀疏矩陣的減法運算(1)如果兩個矩陣尺寸不同,就給出錯誤信息。(2)否則,把這兩個稀疏矩陣線性表上下排列形成一個新的線性表。其中,把第二個線性表中的每一個三元組的元素值變?yōu)樗南喾磾?shù)。(3)做一個循環(huán),把這個線性表中具有相同行號和相同列號的元素進行相加,并進行判斷。(4)如果相加的結(jié)果不為零,那么就把行號、列號和這個值賦值給一個新線性表的三元組的行號、列號和元素值,并且非零元素個數(shù)自加。(5)最后,把原來矩陣的尺寸復制給這個新的線性表的規(guī)模。那么這個線性表即為所求,輸出這個線性表。7.稀疏矩陣的數(shù)乘運算(1)做一個循環(huán),把每一個三元組的元素值乘以k再賦值給它本身。(2)輸出這個線性表。8.稀疏矩陣的乘法運算(1)定義一個二重for循環(huán),外層循環(huán)i從1循環(huán)到第一個矩陣的最大行數(shù),里層循環(huán)c從1循環(huán)到第二個矩陣的最大列數(shù)。(2)在二重for循環(huán)里,再定義一個for循環(huán),掃描第一個線性表中的所有元素,如果有三元組j的行號和二重for循環(huán)中的i相等,那么再定義一個for循環(huán),掃描第二個線性表中的所有元素,判斷是否有三元組a,使三元組a的行號和三元組j的列號相同,且三元組a的列號和二重for循環(huán)中的c相同。(3)如果存在三元組a,那么就把三元組j的元素值和三元組a的元素值相乘再累加。(4)如果這個累加值不為零的話,就把二重for循環(huán)中的i、c和步驟(3)中的累加值分別賦值給一個新線性表中的新創(chuàng)建的三元組的行號、列號和元素值。(5)這個新的線性表即為所求,輸出這個線性表。五、測試結(jié)果及分析:1.測試數(shù)據(jù)測試的數(shù)據(jù)如下圖所示:經(jīng)檢驗,輸出的結(jié)果是正確的。2.時間復雜度分析(1)稀疏矩陣的快速轉(zhuǎn)置方法O(n+t)(2)稀疏矩陣的加法運算(方法一)(M1.m*M1.n+1)*(M1.t+M2.t)(3)稀疏矩陣的加法運算(方法二)(M1.t+M2.t)(4)稀疏矩陣的減法運算(M1.m*M1.n+1)*(M1.t+M2.t)(5)稀疏矩陣的數(shù)乘運算O(t)(6)稀疏矩陣的乘法運算M1.m*M2.n*M1.t*M2.t3.每個模塊設計和調(diào)試時存在問題的思考前兩個模塊,即稀疏矩陣的加法和減法運算比較簡單,但也因思路不夠清晰而出現(xiàn)過錯誤,后來經(jīng)過研究,例子分析,最后得出此算法。實現(xiàn)乘法運算是相對困難的,也是本次綜合訓練的難點,本組同學花了半天的時間思索,才想到了思路,經(jīng)過幾十次的調(diào)試分析,最后才能完成。雖然時間復雜度有點大,但我們付出了自己的汗水和心血。4.算法的改進設想我們組第一次做加法運算程序的時候,二重循環(huán)是對稀疏矩陣的行數(shù)和列數(shù)而言的。所以,當稀疏矩陣的階數(shù)很大時,這個算法的時間復雜度特別高。經(jīng)過我們小組的反復討論和分析后,對加法運算程序進行了改進,這個新的算法的循環(huán)是對稀疏矩陣的非零元素個數(shù)而言的。當稀疏矩陣的階數(shù)很大時,其非零元素個數(shù)相對而言要小得多,所以這個算法的時間復雜度相對而言很小。改進思想:利用“稀疏”特點進行存儲和計算可以大大節(jié)省存儲空間,提高計算效率。六、心得體會和參考資料我們小組的稀疏矩陣運算器的設計和實現(xiàn)主要依賴于三元組線性表的順序存儲結(jié)構(gòu)。在本次綜合訓練的過程中,使我們更加了解了數(shù)據(jù)的存儲結(jié)構(gòu)和程序調(diào)試的技巧,而且小組成員之間團結(jié)協(xié)作,互相幫助,每個人都有很大的收獲。數(shù)據(jù)結(jié)構(gòu)這門課最主要的內(nèi)容在于算法思想,而程序編寫次之。在編寫程序時,如果算法思想是正確的,那么這個程序就已經(jīng)成功了一多半。算法思想在數(shù)據(jù)結(jié)構(gòu)中占有重要地位,所以,要想學好數(shù)據(jù)結(jié)構(gòu)這門課程,平時不只要加強程序的編寫,更要多思考算法思想,加強對算法思想的鍛煉和理解。參考資料:C++數(shù)據(jù)結(jié)構(gòu)與程序設計---RobertL.Kruse(美)AlexanderJ.Ryba(美)著數(shù)據(jù)結(jié)構(gòu)實用教程(第二版)徐孝凱編著C++程序設計(第二版)譚浩強編著七、小組成員分工程序編寫:每個成員都進行了討論和分析,都參與了程序的編寫實驗報告:PPT制作:矩陣及基本運算(杜麗英)

教學目標與要求使學生理解矩陣的概念。熟練掌握矩陣加法、數(shù)乘、乘法轉(zhuǎn)置及可逆矩陣的定義及它們滿足的運算算律。

教學重點與難點教學重點:矩陣的乘法運算;可逆矩陣定義。教學難點:矩陣的乘法。從變量線性變換的乘法引入矩陣乘法的定義。

教學方法與建議在引入矩陣的概念時,通過幾個引例說明矩陣在生產(chǎn)實踐和日常生活中有廣泛的應用。在講矩陣的基本運算時使學生看到,有些運算與數(shù)的運算類似,有些則不然。特別是矩陣乘法不滿足交換律,消去律等。用學生熟悉的變量線性變換引入矩陣的乘法會使其定義更直觀,便于學生理解,對于矩陣乘法不滿足交換律、消去律除舉例說明外,還需進一步說明有些冪指算律不成立,有零因子等。

教學過程設計1.矩陣概念的引入引例1:線性方程組的解取決于系數(shù)和常數(shù)項,線性方程組的系數(shù)和常數(shù)按原位置可排為一個數(shù)表引例2:某航空公司在A,B,C,D四個城市之間開辟了若干條航線,如圖所示表示了四個城市間的航班圖,如果從A到B有航班,則用帶箭頭的線連接AB,從A指向B。某航空公司在A,B,C,D四城市之間開辟了若干航線,如圖所示表示了四城市間的航班圖,如果從A到B有ABCDA0110B1010C1001D0100四個城市間的航班圖情況也可用表格來表示,其中1表示有航班,0表示沒有航班。某航空公司在A,B,C,D四城市之間開辟了若干航線,如圖所示表示了四城市間的航班圖,引例3:甲、乙兩人玩石頭、剪子、布游戲,下面的表格反映甲的贏得情況,其中甲勝得1;甲輸?shù)猫C1;兩人相同為0。乙乙石頭剪子布石頭01-1剪子-101布1-10甲

甲2.矩陣的定義(1)定義1:由個數(shù)排成行列的數(shù)表用小括號或中括號將其括起來,稱為矩陣,并用一個大寫字母表示,即,簡記為.①稱為的行列元素④稱為方陣②稱為實矩陣⑤稱為行矩陣或行向量③稱為復矩陣⑥稱為列矩陣或列向量(2)幾個特殊矩陣零矩陣:所有元素都是0的矩陣.即單位矩陣;數(shù)量矩陣對角矩陣上三角形矩陣;下三角形矩陣例1:設變量可由變量表示為稱之為由變量到變量的線性變換,它與矩陣是一一對應的.3.矩陣的基本運算定義同型矩陣:指兩個矩陣對應的行數(shù)相等、對應的列數(shù)相等的矩陣.矩陣相等:設,,若,稱.(1)線性運算:,加法:數(shù)乘:負矩陣:減法:算律:設為同階矩陣,為常數(shù),則有①⑤②⑥③⑦④⑧例2設,滿足,求.解(2)矩陣乘法:引入:設有兩個線性變換(Ⅰ)(Ⅱ)若想求出從到的線性變換,需將(Ⅱ)代入(Ⅰ),整理得(Ⅲ)分別比較(Ⅰ)、(Ⅱ)、(Ⅲ)式的矩陣,,線性變換(Ⅲ)稱為線性變換(Ⅰ)與(Ⅱ)的乘積,相應的矩陣C稱為矩陣A與B的乘積,即C=AB,或=定義:設,其中元素[注]的列數(shù)=的行數(shù)。的行數(shù)=的行數(shù);的列數(shù)=的列數(shù).與的先后次序不能改變.設,則例4,,[注]無意義.例5,,[注];,,但是.算律:①結(jié)合律:②分配律:③④,應用:設,,,線性方程組的矩陣形式線性變換的矩陣形式(3)方陣的冪:,為正整數(shù),,算律:①②[注]一般例6,求.解:可以利用數(shù)學歸納法證得:(4)逆矩陣定義:對于,若有滿足,則稱為可逆矩陣,并把稱為的逆矩陣。(或性質(zhì):①若為可逆矩陣,則的逆矩陣唯一.并且記的逆為②.③,則.④與都可逆,則可逆,且.一般有規(guī)定:可逆,定義,,則有,(,為整數(shù))例7驗證:與互為逆矩陣解:由于那么與互為逆矩陣。例8求解方程組,其中解:由例7知,于是即方程組的解為例9設方陣與滿足,試證可逆。證:由,有,即或于是則可逆,且例10證明當時,可逆,并且證:因,令那么,同理,因此可逆,并且應用:(1)階線性方程組求解。設,若可逆,則(2)求線性變換的逆變換。設,若可逆,(3)矩陣方程求解。設可逆,可逆,且已知,則實驗1矩陣運算一實驗目的熟悉MATLAB軟件中關于矩陣初等變換的方法以及矩陣運算的各種命令。二實驗內(nèi)容與要求1.啟動與退出雙擊MATLAB圖標,進入MATLAB命令窗口,即可輸入命令,開始運算。單擊File菜單中的Exit,或使用MATLAB命令退出。數(shù)的輸入>>a=5回車:a=5輸入復數(shù)2—5i:b=2.0000-5.0000i問題1.1:輸入“>>a=5;”,回車后與上面有什么區(qū)別?在行尾加“;”,該行結(jié)果不顯示;在行尾加“,”或加“,”或不加標點,該行結(jié)果顯示。注意,在MATLAB中,標點符號一定要在英文狀態(tài)下輸入!數(shù)組的輸入>>b=[1,3,5,7,9,11]>>c=1:2:11>>d=linspace(1,11,6)問題1.2:體會以上輸入放有什么區(qū)別和聯(lián)系。若b為在0~2pi之間均勻分布的22個數(shù)據(jù)c=(1.3,2.5,7.6,2,-3),d=(23,20,17,14,11,8,5,2),各用何種方法輸入比較簡單?(3)矩陣的輸入>>A=[2,3,5;1,3,5;6,9,4]%行之間要用分號隔開A=235135694等待鍵盤輸入命令格式為:>>m=input(‘請輸入初始量,m=’);請輸入初始量,m=問題1.3:輸入A(2,3),結(jié)果如何?輸入A(7)又如何?體會以上輸入的結(jié)果,注意,數(shù)和數(shù)組可作為矩陣的特。注意:變量名開頭必須是英文字母,后面的字符可以是英文,數(shù)字和下劃線,但不包含空格和標點;6.5版變量名最長可包含63個字符,以前的版本最多為31個字符;變量名,函數(shù)名對字母大小寫是區(qū)分的。3.矩陣的大小的測試和定位>>A=[3,5,6;2,5,8;3,5,9;3,7,9];>>d=numel(A)%測試定矩陣A的元素,5.x版本沒有此命令>>[n,m]=size(A)%測試A的行(n),列(m)數(shù)結(jié)果為:d=12n=4m=3>>[I,j]=find(A>3);%找出A中大于3的元素的行數(shù)注意:“%”后面是注釋句,被忽略而不執(zhí)行;對一個數(shù)組可用n=length(A),A若是矩陣,ng3出A的行,列數(shù)的最大值。4.矩陣的塊的操作>>A=(2,:);%取出A的第2行的所有元素>>A=([1,3],:);%取出A的第1,3行的所有元素>>A=(2:3,1:2)%取出A的2,3行與1,2列交叉的元素ans=55>>A([1,3],:)=A([3,1],:);%將A的1行和3行互換問題1.4:如何將A的2,3列互換?>>A=(2,:)=4;%將A的第2行的所有元素用4取代>>A(find(A==3))=-3;%將A中等于3的所有的元素換為-3>>A=(2,:)=[]%刪除A的第2行ans=565979>>reshape(A,2,6)%返回以A的元素重新構(gòu)造的26維矩陣自找23個例子,熟悉數(shù)和數(shù)組的各種運算,以及它們的各種函數(shù)值。自找23個例子,熟悉矩陣的加減乘除及其他運算,注意和點運算的區(qū)別。輸入一個矩陣A,取出A的第2行第1列的元素;取出A的第1,3,4列的所有元素;讓A的第1列和第3列互換;刪除A的第2列。產(chǎn)生3×4維的1矩陣,產(chǎn)生4×2維的隨機矩陣,產(chǎn)生4維的單位矩陣。將A的第2行元素擴大2倍,再增加3后作為A的第3行元素。輸入任意矩陣A,B(它們的元素個數(shù)相等),命令A(:)和A(:)=B會產(chǎn)生什么結(jié)果?A=[1,3,5;5,8,3;6,1,6],B=[3,6;9,3;4,7],C=[3,7,9,4,0,7],D=2:6,體會命令[A,B],[A,C],[A,B,D]所產(chǎn)生的結(jié)果,學習由小矩陣生成大矩陣的方法。四.提高內(nèi)容1.多維數(shù)組的創(chuàng)建格式:A=cat(n,A1,A2,…,Am).說明:n=1和n=2時分別構(gòu)造的[A1:A2]和[A1:A2],都是二維數(shù)組,而n=3時都可以構(gòu)造出三維數(shù)組?!纠?.2】>>A1=[1,2,3;4,5,6;7,8,9];A2=A1';A3=A2-A1;>>A4=cat(3,A1,A2,A3)或用另一種原始方式定義A4(:,:,1)=123456789A4(:,:,2)=147258369A4(:,:,3)=024-202-4-202.張量積格式:C=kron(A,B)%A為m×n矩陣,B為p×q矩陣,則C為mp×nq矩陣。說明:A與B的張量積定義為C=AB=其中,AB與BA均為mp×nq矩陣,但一般AB≠BA。【例1.3】A=,B=,求AB。>>A=[12;34];B=[123;456;789];>>C=kron(A,B)C=1232464568101278914161836948121215181620242124272832363.矩陣的范數(shù)格式:n=norm(A)%求矩陣A的普范數(shù),等于A的最大奇異值。n=norm(A,1)%求A的列范數(shù)(1—范數(shù)),等于A的最大列之和。n=norm(A,2)%求A的2—范數(shù),和norm(A)相同。n=norm(A,inf)%求行范數(shù)(無窮大范數(shù)),等于A的最大數(shù)之和。n=norm(A,’for’)%求矩陣A的Frobenius范數(shù),‖A‖F(xiàn)=4.LU分解矩陣的三角分解又稱LU分解,它的目的是將一個矩陣分解成一個下三角矩陣L和一個上三角矩陣U的乘積,將A=LU。格式:[L,U]=lu(X)%U為上三角陣,L為下三角陣或其變換形式,滿足LU=X,[L,U,P]=lu(X)%U為上三角陣,L為下三角陣,P為單位矩陣的行邊換滿足LU=PX?!纠?.4】>>A=[123;456;789];>>[L,U]=lu(A)L=0.14291.000000.57140.50001.00001.000000U=7.00008.00009.000000.85711.7143000.0000>>[L,U,P]=lu(A)L=1.0000000.14291.000000.57140.50001.0000U=7.00008.00009.000000.85711.7143000.0000P=0011000105.QR分解將矩陣A分解成一個正交矩陣與一個上三角矩陣的乘積。格式:[Q,R]=qr(A)%求得正交矩陣Q和上三角陣R,Q和R滿足A=QR。[Q,R,E]=qr(A)%求得正交矩陣Q和上三角陣R,E為單位矩陣的變換形式,R的對角線元素按大小降序排列,滿足AE=QR。例1.5>>A=[1,2,3;4,5,6;7,8,9;10,11,12];>>[Q,R]=qr(A)Q=-0.0776-0.83310.5456-0.0478-0.3105-0.4512-0.69190.4704-0.5433-0.0694-0.2531-0.7975-0.77620.31240.39940.3748R=-12.8841-14.5916-16.29920-1.0413-2.0826000ans=323355576899>>A(4,5)=3;%擴大A的維數(shù),A成為4╳5矩陣,未定義元素為0>>[A(1:3、2:3),A(2:4、1:2);A,A(:、2)]%由小矩陣構(gòu)造大矩陣,注意行列維數(shù)的搭配ans=2343366553251232436365352505>>diag(A、k);%抽取矩陣A的第k條對角線元素向量>>tril(A、k);%抽取矩陣A的第k條對角線下面的部分>>triu(A、k);%抽取矩陣A的第k條對角線上面的部分注意:“:”表示“全部”.5.矩陣的翻轉(zhuǎn)操作>>flipud(A);%A進行上下翻轉(zhuǎn)>>fliplr(A);%A進行左右翻轉(zhuǎn)>>rot90(A);%A逆時針旋轉(zhuǎn)90o問題1.5:rot90(A,2)和rot90(A,-2)結(jié)果有區(qū)別嗎?6.特殊矩陣的產(chǎn)生>>A=eye(n);%產(chǎn)生n維單位矩陣>>A=ones(n、m);%產(chǎn)生n╳m維1矩陣>>A=zeros(n、m);%產(chǎn)生n╳m維0矩陣>>A=rand(n、m);%產(chǎn)生n╳m維隨機矩陣(元素在9∽1之間)問題1.6:產(chǎn)生一個在區(qū)間[10,20]內(nèi)均勻分布的4階隨機矩陣.>>randn(m、n);%產(chǎn)生m╳n正態(tài)分布隨機矩陣>>randperm(n);%產(chǎn)生1∽n之間整數(shù)的隨機排列【例1.1】>>randperm(6)ans=321546>>logspace(a、b、n);%在(10a、10b)之間產(chǎn)生n個對數(shù)等分量>>diag(a、b、n);%產(chǎn)生以a、b、c、d、…為對角線元素的矩陣>>hilb(n);%返回n階hilbert矩陣,其元素為H(i、j)=1/(i+j-1)>>magic(n);%產(chǎn)生n階魔方矩陣7.數(shù)的運算>>4+2;>>4*2;>>4/2;%右除2,等于2>>4/2;%4左除2,等于0.5>>4^3;%4的3次方>>sqrt(4);%4的算術(shù)平方根>>exp(3);%e的3次方,不能輸成e^3>>log(4);%4的自然對數(shù),log10(4)是以10為底,log2(4)是以2為底8.矩陣的運算>>A,;%A的轉(zhuǎn)置>>det(A);%A的行列式,A必須是方陣>>reank(A);%A的秩>>inv(A);%A的逆>>eig(A);%A的本征值>>[X,D]=eig(A);%A的本征矢量X及本征值D>>trace(A);%A的跡,等于A的對角線元素之和>>3*A;%常數(shù)與矩陣相乘>>A+B;%A,B必須是同維矩陣,和3+A進行比較>>A-B;%A,B必須是同維矩陣,和3-A進行比較>>A*B;%和A.*B進行比較>>A/B;%(和A./B進行比較)>>A\B;%(和A.\B進行比較)>>A^2;%A^2相當于A*A(和A.^2進行比較)注意:矩陣的加減乘除按相關規(guī)則運算,否則給出警告信息;“.*”,“./”,“.\”,“.^”稱為點運算(或稱數(shù)組運算,又稱元素群運算),點運算是前后矩陣對應元素之間的運算。問題1.7:求出A的本征矢量和本征值,比較2^4(A必須是方陣)和2.^A的區(qū)別.矩陣的其他運算和函數(shù)見表1.3.9.變量的存儲與調(diào)用(1)存儲>>savedataabc%將變量a,b,c存到data.mat文件中(2)調(diào)用>>loaddata%data.mat文件中所有變量加載到工作空間10.列出工作空間所有變量>>whos%列出工作空間所有變量的變量名、大小、字節(jié)數(shù)、數(shù)組維數(shù)11.聯(lián)機求助>>helpsqrt%將顯示出平方根sqrt命令的功能和使用方式五、練習和思考①熟悉MATLAB的啟動和退出.表1。1基本的數(shù)學函數(shù)函數(shù)名含義函數(shù)名含義sin/cos正弦/余弦函數(shù)asin/acos反正弦/反余弦函數(shù)tan/cot正切/余切函數(shù)atan/acos反正切/反余切函數(shù)sec/csc正割/余割函數(shù)aec/acec反正割/反余割函數(shù)sinh/cosh雙曲正弦/雙曲余弦函數(shù)asinh/acosh反雙曲正弦/反雙曲余弦函數(shù)tanh/coth雙曲正切/雙曲余切函數(shù)atanh/acosh反雙曲正切/反雙曲余函數(shù)sech/csch雙曲正割/雙曲余割函數(shù)asech/acsch反雙曲正割/反雙曲余割函數(shù)exp指數(shù)函數(shù)sqrt平方根函數(shù)log對數(shù)函數(shù)log10常用對數(shù)函數(shù)abs絕對值函數(shù)angle角相位函數(shù)imag復數(shù)虛部函數(shù)real復數(shù)實部函數(shù)conj共軛復數(shù)函數(shù)sign正負符號函數(shù)fix朝零方向取整ceil朝正無窮方向取整round四舍五入取整floor朝無窮方向取整rem求余函數(shù)mod求余函數(shù)(帶符號)gcd最大公約數(shù)lcm最小公倍數(shù)perms排列nchoosek組合表1.2特殊變量與函數(shù)函數(shù)名含義函數(shù)名含義ans默認返回變量eps默認相對浮點精度nargin函數(shù)輸入變量個數(shù)nargout函數(shù)輸出變量個數(shù)yarargin函數(shù)中輸入的可選參數(shù)varargout函數(shù)中輸出的可選參數(shù)i虛數(shù)單位pi圓周率inf無窮值nan不定值flnps浮點運算次數(shù)inputname輸入?yún)?shù)名表1.3矩陣邊換和矩陣函數(shù)函數(shù)名含義函數(shù)名含義flipud矩陣上下翻轉(zhuǎn)fliplr矩陣左右翻轉(zhuǎn)rot90矩陣旋轉(zhuǎn)90°diag產(chǎn)生或提取對角陣tril產(chǎn)生或提取下三角陣triu產(chǎn)生或提取上三角陣eye產(chǎn)生單位矩陣rand產(chǎn)生隨機矩陣ones產(chǎn)生1矩陣zeros產(chǎn)生零矩陣linespace構(gòu)造線性分布向量logspace構(gòu)造對數(shù)分布向量det行列式的值eig矩陣的特征值trice矩陣的跡inv矩陣的逆rref化行最簡形null零空間實驗十三MATLAB在復變函數(shù)中的應用一、實驗目的:了解Matlab中有關復數(shù)的功能,能利用Matlab軟件計算復變函數(shù)中的相關問題。二、相關知識我們知道,復數(shù)由實部和虛部組成,表示為:,和為實數(shù),為虛單位。在Matlab中也采用這樣的方法來表示虛數(shù),只是有時也用來表示虛單位。我們可以在命令窗口直接輸入一個復數(shù)z=2+3*I,也可以用complex()命令來生成復數(shù)。用該命令還可生成復向量、復矩陣。例如:a=(1:4);b=(5:8);z2=complex(a,b),則得到如下的結(jié)果:1.0000+5.0000i2.0000+6.0000i3.0000+7.0000i4.0000+8.0000i現(xiàn)在我們來看一下有關復數(shù)的幾個命令:命令real(X)imag(X)angle(X)abs(X)conj(X)功能返回實部返回虛部返回輻角返回模返回共軛這些命令中的X均可以是復數(shù)、復向量、復矩陣。我們前面討論的四則運算、解代數(shù)方程、求極限、求導數(shù)、求積分、級數(shù)展開等運算,都可以運用到復數(shù)上來?,F(xiàn)在我們來看一下關于留數(shù)的計算。留數(shù)是復變函數(shù)中的一個重要概念,按照復變函數(shù)教材上的定義,函數(shù)在點的留數(shù)定義為:其中在區(qū)域內(nèi)解析,是的孤立奇點,為圓周,。按照在的羅朗展開式,可以得到,即在的留數(shù)等于在的羅朗級數(shù)展開式中的系數(shù)。按照定義,我們固然可以通過求函數(shù)的羅朗級數(shù)的方法來求處函數(shù)在給定點的留數(shù),但是如果遇到較為復雜的函數(shù),要求留數(shù)并非一件易事,而Matlab為我們提供了一些計算工具。首先,對于分子分母均為多項式的函數(shù),Matlab有一個專門用于計算留數(shù)的函數(shù)residue(),其格式如下:[R,P,K]=residue(B,A)其中:參數(shù)B是由復變函數(shù)的分子的系數(shù)組成的向量,參數(shù)A是由復變函數(shù)的分母的系數(shù)組成的向量,例如,對于函數(shù),則,,參數(shù)是返回的留數(shù),是由不同奇點的留數(shù)組成的向量。參數(shù)是返回的極點,也是一個向量,參數(shù)是個向量,由B/A的商的多項式系數(shù)組成,如果length(B)<length(A),則K為空向量,否則,length(K)=length(B)-length(A)+1。另外,函數(shù)residue()還可以根據(jù)已知的奇點P,奇點的留數(shù)R和K來計算分式復變函數(shù)的系數(shù)B和A,其格式如下:[B,A]=residue(R,P,K)其中參數(shù)的意義同前。例1:計算復變函數(shù)的留數(shù),然后根據(jù)計算的結(jié)果反求復變函數(shù)的分式表達式的系數(shù)A和B。程序如下:clearB=[1,0];A=[1,0,0,0,-1];[R,P,K]=residue(B,A)[B1,A1]=residue(R,P,K)結(jié)果為:R=0.25000.2500-0.2500+0.0000i-0.2500-0.0000iP=-1.00001.00000.0000+1.0000i0.0000-1.0000iK=[]B1=00.00001.00000.0000A1=1.0000-0.0000-0.00000.0000-1.0000例2:計算復變函數(shù)的留數(shù),然后根據(jù)計算的結(jié)果反求復變函數(shù)的分式表達式的系數(shù)A和B。程序只要修改例1中的B,A為B=[1,3,0,2],A=[1,6,-1]即可,結(jié)果如下:R=18.67060.3294P=-6.16230.1623K=1-3B1=1.00003.0000-0.00002.0000A1=1.00006.0000-1.0000當復變函數(shù)的分子分母不是多項式時,函數(shù)residue()就失效了,此時,我們主要根據(jù)4個留數(shù)計算規(guī)則和一個定理來進行留數(shù)的計算,這4個規(guī)則如下:(1)如果為的一級極點,則;(2)如果為的級極點,則;(3)設,且和在點都解析,如果,,,那么為的一級極點,則在的留數(shù)為:;(4)在無窮遠點的留數(shù):定理是:如果在擴充復平面內(nèi)只有有限個孤立奇點,那么在所有奇點的留數(shù)的總和必定為零。例3:計算函數(shù)在點的留數(shù)。很明顯,和都是的一級極點,所以使用第一個運算法則較為合適。用以下程序可以算得結(jié)果:clearsymszf=z*exp(z)/(z^2-1);z1=1;z2=-1;R1=limit((z-1)*f,z,1)R2=limit((z+1)*f,z,-1)結(jié)果為:R1=1/2*exp(1)R2=1/2*exp(-1)例4:計算函數(shù)在處的留數(shù)。我們可以看出在擴充的復平面上有三個極點:,,,根據(jù)計算留數(shù)的定理,在處的留數(shù)應該等于其在和處留數(shù)的和,和又是的一級奇點,所以有:,因此用以下的程序可以求解:clearsymszf=exp(z)/(z^2-1);R1=limit(f*(z-1),z,1)R2=limit(f*(z+1),z,-1)R=R1+R2結(jié)果如下:R1=1/2*exp(1)R2=-1/2*exp(-1)R=1/2*exp(1)-1/2*exp(-1)三、實驗內(nèi)容1.解方程組:;2.計算函數(shù)在點處的一階導數(shù);3.計算下列表達式在其奇點的留數(shù):(1);(2);(3);(4);4.把作為符號,用函數(shù)Taylor將表達式進行泰勒展開;5.完成實驗報告。數(shù)據(jù)結(jié)構(gòu)課程設計報告設計題目:稀疏矩陣運算器年級班級姓名學號指導教師起止時間學期一、實驗目的通過實習,了解并初步掌握設計、實現(xiàn)較大系統(tǒng)的完整過程,包括系統(tǒng)分析、編碼設計、系統(tǒng)集成、以及調(diào)試分析,熟練掌握數(shù)據(jù)結(jié)構(gòu)的選擇、設計、實現(xiàn)以及操作方法,為進一步的應用開發(fā)打好基礎。二、問題描述(具體任務)設計、實現(xiàn)兩個稀疏矩陣在十字鏈表表示方法下的相加、相減、相乘。稀疏矩陣是指那些多數(shù)元素為零的矩陣。利用稀疏特點進行儲存和計算可以大大節(jié)省儲存空間,提高計算效率。實現(xiàn)一個能進行稱稀疏矩陣基本運算的運算器。三、需求分析該程序所做的工作的是稀疏矩陣運算器,實現(xiàn)兩個稀疏矩陣的基本運算。此程序規(guī)定:1、按照壓縮存儲的概念,只存儲稀疏矩陣的非零元,以兩個三元組{i,j,e}來表示矩陣的非零元的行,列和數(shù)值,就確定了一個非零元.由此,稀疏矩陣可由表示非零元的三元數(shù)組及行列數(shù)確定2、用戶輸入數(shù)據(jù)作為三元組的行,列和非零元的個數(shù),用空格隔開.并輸入非零元的行,列和數(shù)值3、本程序只對兩個矩陣進行四則運算,所的結(jié)果矩陣應該另生成,用十字鏈表存放,并放入新的矩陣中,只要對矩陣求解就能求出答案.四、算法設計思想及流程圖用十字鏈表存儲方式實現(xiàn)稀疏矩陣的基本運算,此程序用到以下函數(shù):voidCreateSMatrix(CrossList&R)//創(chuàng)建儲存稀疏矩陣voidPrintSMatrix(CrossListR)//輸出十字鏈表的函數(shù)voidMultSMatrix(CrossListM,CrossListN,CrossList&Q)//實現(xiàn)矩陣乘法intAddMatrix(CrossListM,CrossListN,CrossList&Q)//實現(xiàn)矩陣加法intSubtSMatrix(CrossListM,CrossListN,CrossList&Q)//實現(xiàn)矩陣減法voidmain()//主函數(shù)調(diào)用以上函數(shù)來實現(xiàn)其功能:首先調(diào)用CreateSMatrix()創(chuàng)建矩陣M和N,并輸入稀疏矩陣的行數(shù),列數(shù),非零元素個數(shù),通過PrintSMatrix()輸出矩陣M和N,根據(jù)提示選擇相應的運算,當進行加或減運算時,如果兩個矩陣的行和列不相等時,就無法得到結(jié)果,并出現(xiàn)提示錯誤信息,當進行乘法運算時,要求矩陣M的列數(shù)必須等于矩陣N的行數(shù),否則無法進行乘法運算,為了進行多種運算通過主函數(shù)的Do----While循環(huán)來實現(xiàn),退出循環(huán)條件是輸入”+”、”-”、”*”以外的任意字符即可退出循環(huán)。五、C語言源代碼#include<stdio.h>#include<stdlib.h>#defineOVERFLOW-1#defineOK1#defineNULL0//建立十字鏈表typedefstructOLNode{introw,col;//該非零元的行和列下標inte;structOLNode*right,*down;//該非零元所在行表和列表的后繼鏈域}OLNode,*OLink;typedefstruct{OLink*rhead,*chead;//行和列鏈表頭指針向量基址由CreateSMatrix分配intmu,nu,tu;//系數(shù)矩陣的行數(shù),列數(shù)和非零元個數(shù)}CrossList;//創(chuàng)建儲存稀疏矩陣voidCreateSMatrix(CrossList&R){intm,n,t,i,j,k,a;OLinkp,q;if(R.rhead){R.rhead=NULL;R.chead=NULL;R.mu=0;R.nu=0;R.tu=0;}printf("\n請輸入稀疏矩陣的行數(shù)列數(shù)非零元個數(shù):");scanf("%d%d%d",&m,&n,&t);R.mu=m;R.nu=n;R.tu=t;if(!(R.rhead=(OLink*)malloc((m+1)*sizeof(OLink))))exit(OVERFLOW);if(!(R.chead=(OLink*)malloc((n+1)*sizeof(OLink))))exit(OVERFLOW);for(i=1;i<=R.mu+1;i++){R.rhead[i]=NULL;}for(i=1;i<=R.nu+1;i++){R.chead[i]=NULL;}for(k=1;k<=R.tu;k++){printf("\n請輸入第%d個非零元的行號列號非零元素值:",k);scanf("%d%d%d",&i,&j,&a);if(!(p=(OLNode*)malloc(sizeof(OLNode))))exit(OVERFLOW);p->row=i;p->col=j;p->e=a;if(R.rhead[i]==NULL||R.rhead[i]->col>j){p->right=R.rhead[i];R.rhead[i]=p;}else{for(q=R.rhead[i];(q->right)&&q->right->col<j;q=q->right);p->right=q->right;q->right=p;}if(R.chead[j]==NULL||R.chead[j]->row>i){p->down=R.chead[j];R.chead[j]=p;}else{for(q=R.chead[j];(q->down)&&q->down->row<i;q=q->down);p->down=q->down;q->down=p;}}}//輸出十字鏈表的函數(shù)voidPrintSMatrix(CrossListR){inti,j;intb=0;OLinkp;for(i=1;i<=R.mu;i++){p=R.rhead[i];printf("\t\t\t\t|");for(j=1;j<=R.nu;j++){if(p!=NULL){if(j==p->col){printf("%4d",p->e);p=p->right;}elseprintf("%4d",b);}elseprintf("%4d",b);}printf("|\n");}}//實現(xiàn)矩陣乘法voidMultSMatrix(CrossListM,CrossListN,CrossList&Q){inti,j,temp=0;OLinkq,pm,pn,pq;Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;if(M.nu!=N.mu){printf("這兩個矩陣不能相乘!");exit(OVERFLOW);}//矩陣相乘條件,矩陣1的行數(shù)必須等于矩陣2的列數(shù)if(M.tu*N.tu!=0){for(i=1;i<=M.mu;i++){for(j=1;j<=N.nu;j++){temp=0;pm=M.rhead[i];pn=N.chead[j];while(pm){while(pn&&pm&&(pm->col>pn->row)){if(pn->down!=NULL)pn=pn->down;elsepn=NULL;}if((pm&&pn&&pm->col==pn->row)){temp+=(pm->e)*(pn->e);if(pm->right!=NULL)pm=pm->right;elsepm=NULL;if(pn->down!=NULL)pn=pn->down;elsepn=NULL;}else{if(pm->right!=NULL)pm=pm->right;elsepm=NULL;}}//while(pm)if(temp){if(!(pq=(OLNode*)malloc(sizeof(OLNode))))exit(OVERFLOW);pq->row=i;pq->col=j;pq->e=temp;if(Q.rhead[i]==NULL||Q.rhead[i]->col>j){pq->right=Q.rhead[i];Q.rhead[i]=pq;}else{for(q=Q.rhead[i];(q->right)&&q->col<j;q=q->right);pq->right=q->right;q->right=pq;}if(Q.chead[j]==NULL||Q.chead[j]->row>i){pq->down=Q.chead[j];Q.chead[j]=pq;}else{for(q=Q.chead[j];(q->down)&&q->row<i;q=q->down);pq->down=q->down;q->down=pq;}(Q.tu)++;}//iftemp}//forj}//fori}//forif}//MultSMatrix()//實現(xiàn)矩陣加法intAddMatrix(CrossListM,CrossListN,CrossList&Q){/*初始條件:稀疏矩陣M與N的行數(shù)和列數(shù)對應相等。*//*操作結(jié)果:求稀疏矩陣的差Q=M+N*/inti,k;OLinkp,pq,pm,pn;OLink*col;if(M.mu!=N.mu||M.nu!=N.nu){printf("兩個矩陣不是同類型的,不能相加\n");exit(OVERFLOW);}Q.mu=M.mu;/*初始化Q矩陣*/Q.nu=M.nu;Q.tu=0;/*元素個數(shù)的初值*/Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink));if(!Q.rhead)exit(OVERFLOW);Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink));if(!Q.chead)exit(OVERFLOW);for(k=1;k<=Q.mu;k++)/*初始化Q的行頭指針向量;各行鏈表為空鏈表*/Q.rhead[k]=NULL;for(k=1;k<=Q.nu;k++)/*初始化Q的列頭指針向量;各列鏈表為空鏈表*/Q.chead[k]=NULL;col=(OLink*)malloc((Q.nu+1)*sizeof(OLink));/*生成指向列的最后結(jié)點的數(shù)組*/if(!col)exit(OVERFLOW);for(k=1;k<=Q.nu;k++)/*賦初值*/col[k]=NULL;for(i=1;i<=M.mu;i++)/*按行的順序相加*/{pm=M.rhead[i];/*pm指向矩陣M的第i行的第1個結(jié)點*/pn=N.rhead[i];/*pn指向矩陣N的第i行的第1個結(jié)點*/while(pm&&pn)/*pm和pn均不空*/{if(pm->col<pn->col)/*矩陣M當前結(jié)點的列小于矩陣N當前結(jié)點的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;p->col=pm->col;p->e=+pm->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/}elseif(pm->col>pn->col)/*矩陣M當前結(jié)點的列大于矩陣N當前結(jié)點的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;p->col=pn->col;p->e=+pn->e;p->right=NULL;pn=pn->right;/*pn指針向右移*/}elseif(pm->e+pn->e){p=(OLink)malloc(sizeof(OLNode));if(!p)exit(OVERFLOW);Q.tu++;p->row=i;p->col=pn->col;p->e=pm->e+pn->e;p->right=NULL;pm=pm->right;pn=pn->right;}else/*矩陣M、N當前結(jié)點的列相等且兩元素之差為0*/{pm=pm->right;/*pm指針向右移*/pn=pn->right;/*pn指針向右移*/continue;}if(Q.rhead[i]==NULL)/*p為該行的第1個結(jié)點*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個結(jié)點)*/else/*插在pq所指結(jié)點之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個結(jié)點*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個結(jié)點*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->]所指結(jié)點之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個結(jié)點*/}}while(pm)/*將矩陣M該行的剩余元素插入矩陣Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;/*給結(jié)點賦值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/if(Q.rhead[i]==NULL)/*p為該行的第1個結(jié)點*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個結(jié)點)*/else/*插在pq所指結(jié)點之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個結(jié)點*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個結(jié)點*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->j]所指結(jié)點之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個結(jié)點*/}}while(pn)/*將矩陣N該行的剩余元素插入矩陣Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;/*給結(jié)點賦值*/p->col=pn->col;p->e=+pn->e;p->right=NULL;pn=pn->right;/*pm指針向右移*/if(Q.rhead[i]==NULL)/*p為該行的第1個結(jié)點*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個結(jié)點)*/else/*插在pq所指結(jié)點之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個結(jié)點*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個結(jié)點*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->j]所指結(jié)點之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個結(jié)點*/}}}for(k=1;k<=Q.nu;k++)if(col[k])/*k列有結(jié)點*/col[k]->down=NULL;/*令該列最后一個結(jié)點的down指針為空*/free(col);returnOK;}//實現(xiàn)矩陣減法intSubtSMatrix(CrossListM,CrossListN,CrossList&Q){/*初始條件:稀疏矩陣M與N的行數(shù)和列數(shù)對應相等。*//*操作結(jié)果:求稀疏矩陣的差Q=M-N*/inti,k;OLinkp,pq,pm,pn;OLink*col;if(M.mu!=N.mu||M.nu!=N.nu){printf("兩個矩陣不是同類型的,不能相減\n");exit(OVERFLOW);}Q.mu=M.mu;/*初始化Q矩陣*/Q.nu=M.nu;Q.tu=0;/*元素個數(shù)的初值*/Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink));if(!Q.rhead)exit(OVERFLOW);Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink));if(!Q.chead)exit(OVERFLOW);for(k=1;k<=Q.mu;k++)/*初始化Q的行頭指針向量;各行鏈表為空鏈表*/Q.rhead[k]=NULL;for(k=1;k<=Q.nu;k++)/*初始化Q的列頭指針向量;各列鏈表為空鏈表*/Q.chead[k]=NULL;col=(OLink*)malloc((Q.nu+1)*sizeof(OLink));/*生成指向列的最后結(jié)點的數(shù)組*/if(!col)exit(OVERFLOW);for(k=1;k<=Q.nu;k++)/*賦初值*/col[k]=NULL;for(i=1;i<=M.mu;i++)/*按行的順序相減*/{pm=M.rhead[i];/*pm指向矩陣M的第i行的第1個結(jié)點*/pn=N.rhead[i];/*pn指向矩陣N的第i行的第1個結(jié)點*/while(pm&&pn)/*pm和pn均不空*/{if(pm->col<pn->col)/*矩陣M當前結(jié)點的列小于矩陣N當前結(jié)點的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;/*給結(jié)點賦值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/}elseif(pm->col>pn->col)/*矩陣M當前結(jié)點的列大于矩陣N當前結(jié)點的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;/*給結(jié)點賦值*/p->col=pn->col;p->e=-pn->e;p->right=NULL;pn=pn->right;/*pn指針向右移*/}elseif(pm->e-pn->e)/*矩陣M、N當前結(jié)點的列相等且兩元素之差不為0*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;/*給結(jié)點賦值*/p->col=pn->col;p->e=pm->e-pn->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/pn=pn->right;/*pn指針向右移*/}else/*矩陣M、N當前結(jié)點的列相等且兩元素之差為0*/{pm=pm->right;/*pm指針向右移*/pn=pn->right;/*pn指針向右移*/continue;}if(Q.rhead[i]==NULL)/*p為該行的第1個結(jié)點*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個結(jié)點)*/else/*插在pq所指結(jié)點之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個結(jié)點*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個結(jié)點*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->]所指結(jié)點之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個結(jié)點*/}}while(pm)/*將矩陣M該行的剩余元素插入矩陣Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;/*給結(jié)點賦值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/if(Q.rhead[i]==NULL)/*p為該行的第1個結(jié)點*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個結(jié)點)*/else/*插在pq所指結(jié)點之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個結(jié)點*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個結(jié)點*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->j]所指結(jié)點之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個結(jié)點*/}}while(pn)/*將矩陣N該行的剩余元素插入矩陣Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素數(shù)加1*/p->row=i;/*給結(jié)點賦值*/p->col=pn->col;p->e=-pn->e;p->right=NULL;pn=pn->right;/*pm指針向右移*/if(Q.rhead[i]==NULL)/*p為該行的第1個結(jié)點*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個結(jié)點)*/else/*插在pq所指結(jié)點之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個結(jié)點*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個結(jié)點*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->j]所指結(jié)點之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個結(jié)點*/}}}for(k=1;k<=Q.nu;k++)if(col[k])/*k列有結(jié)點*/col[k]->down=NULL;/*令該列最后一個結(jié)點的down指針為空*/free(col);returnOK;}//主函數(shù)voidmain(){intm,i,n;charc;CrossListM,N,Q;printf("********創(chuàng)建稀疏矩陣M*********\n");CreateSMatrix(M);printf("\t***稀疏矩陣M的通常陣列形式為:\n");PrintSMatrix(M);printf("\n\t********創(chuàng)建稀疏矩陣N********\n\n");CreateSMatrix(N);printf("\t***稀疏矩陣N的通常陣列形式為:\n");PrintSMatrix(N);m=M.mu;n=N.nu;if(!(Q.rhead=(OLink*)malloc((m+1)*sizeof(OLink))))exit(OVERFLOW);if(!(Q.chead=(OLink*)malloc((n+1)*sizeof(OLink))))exit(OVERFLOW);for(i=1;i<=((M.mu>N.nu)?(M.mu+1):(N.nu+1));i++){Q.rhead[i]=NULL;Q.chead[i]=NULL;}Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;do{printf("如做加法,請輸入+,如做減法,請輸入-,如做乘法,請輸入*:\t");getchar();scanf("%c",&c);if(c=='+'){AddMatrix(M,N,Q);printf("\t***稀疏矩陣M+N的通常陣列形式為:\n");PrintSMatrix(Q);}elseif(c=='-'){SubtSMatrix(M,N,Q);printf("\t***稀疏矩陣M-N的通常陣列形式為:\n");PrintSMatrix(Q);}elseif(c=='*'){MultSMatrix(M,N,Q);printf("\t***稀疏矩陣M*N的通常陣列形式為:\n");PrintSMatrix(Q);}elsebreak;}while(1);}六、測試分析(運行結(jié)果)七、總結(jié)(收獲及體會)通過此次的課程設計對十字鏈表存儲的稀疏矩陣更深一步的理解和認識,一開始我們從參考書上找來了課題,但是畢竟是參考書,做到后來發(fā)現(xiàn)很多程序都是不完整的,這讓我們傷透了腦筋??粗鴦e的小組都弄得有模有樣了,可是我們還沒有一點頭緒,好不容易又從網(wǎng)絡和參考書找到了相關信息,可是結(jié)果還是很不盡人意。程序都弄好了,調(diào)試也沒有問題,可是就是無法達到預期想要的結(jié)果。查閱的資料只是一個參考,最后還是要靠自己動腦筋,然后我們大家一起齊心協(xié)力,雖然內(nèi)容并不是很復雜,但是我們覺得設計的過程相當重要,學到了很多,收獲了很多。我覺得課程設計反映的是一個從理論到實際應用的過程,但是更遠一點可以聯(lián)系到以后畢業(yè)之后從學校轉(zhuǎn)到踏上社會的一個過程。小組人員的配合﹑相處,以及自身的動腦和努力,都是以后工作中需要的。八、參考文獻數(shù)據(jù)結(jié)構(gòu)(C語言版)嚴蔚敏吳偉明編著清華大學出版社五、調(diào)試分析1、本程序中相乘部分較易,但是相加的部分則是讓人傷腦筋,但最還仔細分析還是可以實現(xiàn)的。2、在用十字鏈表表示稀疏矩陣時,相加或相減所得的結(jié)果應該另生成,乘積矩陣也可用二維數(shù)組表示。3、通過數(shù)據(jù)的測試,能按要求實現(xiàn)功能。安徽理工大學數(shù)據(jù)結(jié)構(gòu)課程設計說明書題目:稀疏矩陣的運算院系:計算機科學與工程學院專業(yè)班級:計算機10-*班學號:202130****學生姓名:******指導教師:2021年12月28日安徽理工大學課程設計(論文)任務書計算機科學與工程學院2021年11月8日安徽理工大學課程設計(論文)成績評定表目錄1問題描述............................................12需求分析............................................13總體設計............................................23.1Matrix結(jié)構(gòu)的定義................................23.2系統(tǒng)流程圖......................................34詳細設計............................................44.1“菜單”界面....................................44.2建立矩陣........................................44.3顯示矩陣..........................

溫馨提示

  • 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

提交評論