




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
綜合訓(xùn)練稀疏矩陣運(yùn)算器(完整版)實(shí)用資料(可以直接使用,可編輯完整版實(shí)用資料,歡迎下載)
《數(shù)據(jù)結(jié)構(gòu)》綜合訓(xùn)練稀疏矩陣運(yùn)算器(完整版)實(shí)用資料(可以直接使用,可編輯完整版實(shí)用資料,歡迎下載)綜合訓(xùn)練報(bào)告理學(xué)院課程設(shè)計(jì)報(bào)告參考格式一、題目:稀疏矩陣運(yùn)算器二、目的和要求:使學(xué)生掌握稀疏矩陣的存儲(chǔ)方法及其運(yùn)算。要求利用C++語(yǔ)言實(shí)現(xiàn)一個(gè)能實(shí)現(xiàn)稀疏矩陣簡(jiǎn)單運(yùn)算的程序。具體要求如下:1、采用順序存儲(chǔ)方式。2、提供稀疏矩陣的輸入功能。輸入方式可以采用三元組方式,也可采用用戶直接輸入方式等。3、實(shí)現(xiàn)稀疏矩陣的轉(zhuǎn)置功能。可以將用戶輸入的稀疏矩陣進(jìn)行轉(zhuǎn)置,并將轉(zhuǎn)置后的稀疏矩陣顯示到屏幕。4、稀疏矩陣的加法運(yùn)算功能。提供用戶連續(xù)輸入兩個(gè)稀疏矩陣的功能,并能將所求的兩個(gè)稀疏矩陣的和顯示出來。5、稀疏矩陣的乘法運(yùn)算功能。提供用戶連續(xù)輸入兩個(gè)稀疏矩陣的功能,并能將所求的兩個(gè)稀疏矩陣的和顯示出來。6、稀疏矩陣輸出要求輸出為完整形式。三、概要設(shè)計(jì):稀疏矩陣的順序儲(chǔ)存結(jié)構(gòu),就是對(duì)其相應(yīng)的三元組線性表進(jìn)行順序存儲(chǔ)。每個(gè)非零元素的三元組用如下結(jié)構(gòu)定義:structTriple{introw,col;ElemTypeval;};其中,row和col用來分別存儲(chǔ)元素的行號(hào)和列號(hào),val用來存儲(chǔ)元素值。一個(gè)稀疏矩陣的順序存儲(chǔ)類型定義如下。structSMatrix{intm,n,t;Triplesm[maxterms+1];};其中,m、n和t分別用來存儲(chǔ)稀疏矩陣的行數(shù)、列數(shù)和非零元素的個(gè)數(shù),sm數(shù)組用來順序存儲(chǔ)每個(gè)三元組元素。稀疏矩陣的加法、減法、數(shù)乘和乘法模塊調(diào)用了稀疏矩陣的初始化和輸出函數(shù)。四、算法描述:1.稀疏矩陣的輸入(1)首先把形參m,n傳遞給稀疏矩陣的行數(shù)和列數(shù),確定稀疏矩陣的規(guī)模。(2)定義整型變量row,col,val分別用來存儲(chǔ)三元組的行號(hào)、列號(hào)和元素值,定義整型變量k表示第k個(gè)三元組元素,其中k初值為零。(3)定義一個(gè)while循環(huán),k自加,然后把每次輸入的row,col,val的值分別賦值給第k個(gè)三元組元素的行號(hào)、列號(hào)和元素值。(4)當(dāng)輸入完所有的三元組后,以輸入特殊的三元組(0,0,0)結(jié)束整個(gè)輸入過程,并且把k的值賦值給稀疏矩陣非零元素的個(gè)數(shù)。2.稀疏矩陣的輸出(1)定義一個(gè)二重for循環(huán)來輸出稀疏矩陣每一行,每一列的元素。(2)在二重for循環(huán)中再定義一個(gè)for循環(huán)來判斷每一個(gè)非零元素。(3)如果這個(gè)非零元素的行號(hào)和列號(hào)分別與這個(gè)二重循環(huán)的行數(shù)和列數(shù)相等,那么就輸出這個(gè)非零元素的值。否則,就輸出零。3.稀疏矩陣的快速轉(zhuǎn)置方法(1)首先把稀疏矩陣的行數(shù)、列數(shù)和非零元素的個(gè)數(shù)m,n,t賦值給轉(zhuǎn)置矩陣的列數(shù)、行數(shù)和非零元數(shù)的個(gè)數(shù)。(2)如果這個(gè)矩陣是零矩陣(即非零元素的個(gè)數(shù)為零的矩陣),那么轉(zhuǎn)換完畢返回。否則,為num和pot向量動(dòng)態(tài)分配存儲(chǔ)空間。然后對(duì)num向量進(jìn)行初始化,置每個(gè)分量為0.(3)第1遍掃描數(shù)組M.sm,統(tǒng)計(jì)出每一列(即轉(zhuǎn)換后的每一行)非零元素的個(gè)數(shù)。(4)計(jì)算每一列(即轉(zhuǎn)換后的每一行)的第1個(gè)非零元素在S.sm中存儲(chǔ)位置。(5)對(duì)M.sm進(jìn)行第2遍掃描,把每個(gè)元素行、列值互換寫入到S.sm的確定位置。(6)刪除動(dòng)態(tài)分配的數(shù)組,返回轉(zhuǎn)置矩陣。4.稀疏矩陣的加法運(yùn)算(方法1)(1)如果兩個(gè)矩陣尺寸不同,就給出錯(cuò)誤信息。(2)否則,把這兩個(gè)稀疏矩陣線性表上下排列形成一個(gè)新的線性表。(3)做一個(gè)循環(huán),把這個(gè)線性表中具有相同行號(hào)和相同列號(hào)的元素進(jìn)行相加,并進(jìn)行判斷。(4)如果相加的結(jié)果不為零,那么就把行號(hào)、列號(hào)和這個(gè)值賦值給一個(gè)新線性表的三元組的行號(hào)、列號(hào)和元素值,并且非零元素個(gè)數(shù)自加。(5)最后,把原來矩陣的尺寸復(fù)制給這個(gè)新的線性表的規(guī)模。那么這個(gè)線性表即為所求,輸出這個(gè)線性表。5.稀疏矩陣的加法運(yùn)算(方法2)(1)如果兩個(gè)矩陣尺寸不同,就給出錯(cuò)誤信息。(2)否則,定義一個(gè)while循環(huán),一直循環(huán)到兩個(gè)稀疏矩陣線性表中的某一個(gè)線性表掃描完畢。(3)判斷兩個(gè)線性表中的兩個(gè)三元組的行號(hào)是否相等,如果不相等,就把行號(hào)較小的那個(gè)三元組傳遞給一個(gè)新的線性表,把較大的三元組在與另一個(gè)線性表的下一個(gè)三元組再進(jìn)行比較。(4)如果行號(hào)相等的話,再判斷兩個(gè)三元組的列號(hào)是否相等。如果不相等,就把列號(hào)較小的那個(gè)三元組傳遞給那個(gè)新的線性表,把較大的三元組在與另一個(gè)線性表的下一個(gè)三元組再進(jìn)行比較。(5)如果列號(hào)相等的話,就把兩個(gè)三元組的元素值相加。(6)如果相加的值不為零,就把這個(gè)值賦值給新線性表的一個(gè)新的三元組的元素值。把三元組的行號(hào)和列號(hào)也依次賦值給新三元組的行號(hào)和列號(hào)。(7)如果相加的值為零,就再比較兩個(gè)線性表的下一個(gè)三元組。(8)當(dāng)這個(gè)while循環(huán)循環(huán)完畢后,把另一個(gè)線性表的剩余元素依次傳遞給那個(gè)新的線性表。(9)這個(gè)新的線性表即為所求,輸出這個(gè)新的稀疏矩陣。6.稀疏矩陣的減法運(yùn)算(1)如果兩個(gè)矩陣尺寸不同,就給出錯(cuò)誤信息。(2)否則,把這兩個(gè)稀疏矩陣線性表上下排列形成一個(gè)新的線性表。其中,把第二個(gè)線性表中的每一個(gè)三元組的元素值變?yōu)樗南喾磾?shù)。(3)做一個(gè)循環(huán),把這個(gè)線性表中具有相同行號(hào)和相同列號(hào)的元素進(jìn)行相加,并進(jìn)行判斷。(4)如果相加的結(jié)果不為零,那么就把行號(hào)、列號(hào)和這個(gè)值賦值給一個(gè)新線性表的三元組的行號(hào)、列號(hào)和元素值,并且非零元素個(gè)數(shù)自加。(5)最后,把原來矩陣的尺寸復(fù)制給這個(gè)新的線性表的規(guī)模。那么這個(gè)線性表即為所求,輸出這個(gè)線性表。7.稀疏矩陣的數(shù)乘運(yùn)算(1)做一個(gè)循環(huán),把每一個(gè)三元組的元素值乘以k再賦值給它本身。(2)輸出這個(gè)線性表。8.稀疏矩陣的乘法運(yùn)算(1)定義一個(gè)二重for循環(huán),外層循環(huán)i從1循環(huán)到第一個(gè)矩陣的最大行數(shù),里層循環(huán)c從1循環(huán)到第二個(gè)矩陣的最大列數(shù)。(2)在二重for循環(huán)里,再定義一個(gè)for循環(huán),掃描第一個(gè)線性表中的所有元素,如果有三元組j的行號(hào)和二重for循環(huán)中的i相等,那么再定義一個(gè)for循環(huán),掃描第二個(gè)線性表中的所有元素,判斷是否有三元組a,使三元組a的行號(hào)和三元組j的列號(hào)相同,且三元組a的列號(hào)和二重for循環(huán)中的c相同。(3)如果存在三元組a,那么就把三元組j的元素值和三元組a的元素值相乘再累加。(4)如果這個(gè)累加值不為零的話,就把二重for循環(huán)中的i、c和步驟(3)中的累加值分別賦值給一個(gè)新線性表中的新創(chuàng)建的三元組的行號(hào)、列號(hào)和元素值。(5)這個(gè)新的線性表即為所求,輸出這個(gè)線性表。五、測(cè)試結(jié)果及分析:1.測(cè)試數(shù)據(jù)測(cè)試的數(shù)據(jù)如下圖所示:經(jīng)檢驗(yàn),輸出的結(jié)果是正確的。2.時(shí)間復(fù)雜度分析(1)稀疏矩陣的快速轉(zhuǎn)置方法O(n+t)(2)稀疏矩陣的加法運(yùn)算(方法一)(M1.m*M1.n+1)*(M1.t+M2.t)(3)稀疏矩陣的加法運(yùn)算(方法二)(M1.t+M2.t)(4)稀疏矩陣的減法運(yùn)算(M1.m*M1.n+1)*(M1.t+M2.t)(5)稀疏矩陣的數(shù)乘運(yùn)算O(t)(6)稀疏矩陣的乘法運(yùn)算M1.m*M2.n*M1.t*M2.t3.每個(gè)模塊設(shè)計(jì)和調(diào)試時(shí)存在問題的思考前兩個(gè)模塊,即稀疏矩陣的加法和減法運(yùn)算比較簡(jiǎn)單,但也因思路不夠清晰而出現(xiàn)過錯(cuò)誤,后來經(jīng)過研究,例子分析,最后得出此算法。實(shí)現(xiàn)乘法運(yùn)算是相對(duì)困難的,也是本次綜合訓(xùn)練的難點(diǎn),本組同學(xué)花了半天的時(shí)間思索,才想到了思路,經(jīng)過幾十次的調(diào)試分析,最后才能完成。雖然時(shí)間復(fù)雜度有點(diǎn)大,但我們付出了自己的汗水和心血。4.算法的改進(jìn)設(shè)想我們組第一次做加法運(yùn)算程序的時(shí)候,二重循環(huán)是對(duì)稀疏矩陣的行數(shù)和列數(shù)而言的。所以,當(dāng)稀疏矩陣的階數(shù)很大時(shí),這個(gè)算法的時(shí)間復(fù)雜度特別高。經(jīng)過我們小組的反復(fù)討論和分析后,對(duì)加法運(yùn)算程序進(jìn)行了改進(jìn),這個(gè)新的算法的循環(huán)是對(duì)稀疏矩陣的非零元素個(gè)數(shù)而言的。當(dāng)稀疏矩陣的階數(shù)很大時(shí),其非零元素個(gè)數(shù)相對(duì)而言要小得多,所以這個(gè)算法的時(shí)間復(fù)雜度相對(duì)而言很小。改進(jìn)思想:利用“稀疏”特點(diǎn)進(jìn)行存儲(chǔ)和計(jì)算可以大大節(jié)省存儲(chǔ)空間,提高計(jì)算效率。六、心得體會(huì)和參考資料我們小組的稀疏矩陣運(yùn)算器的設(shè)計(jì)和實(shí)現(xiàn)主要依賴于三元組線性表的順序存儲(chǔ)結(jié)構(gòu)。在本次綜合訓(xùn)練的過程中,使我們更加了解了數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)和程序調(diào)試的技巧,而且小組成員之間團(tuán)結(jié)協(xié)作,互相幫助,每個(gè)人都有很大的收獲。數(shù)據(jù)結(jié)構(gòu)這門課最主要的內(nèi)容在于算法思想,而程序編寫次之。在編寫程序時(shí),如果算法思想是正確的,那么這個(gè)程序就已經(jīng)成功了一多半。算法思想在數(shù)據(jù)結(jié)構(gòu)中占有重要地位,所以,要想學(xué)好數(shù)據(jù)結(jié)構(gòu)這門課程,平時(shí)不只要加強(qiáng)程序的編寫,更要多思考算法思想,加強(qiáng)對(duì)算法思想的鍛煉和理解。參考資料:C++數(shù)據(jù)結(jié)構(gòu)與程序設(shè)計(jì)---RobertL.Kruse(美)AlexanderJ.Ryba(美)著數(shù)據(jù)結(jié)構(gòu)實(shí)用教程(第二版)徐孝凱編著C++程序設(shè)計(jì)(第二版)譚浩強(qiáng)編著七、小組成員分工程序編寫:每個(gè)成員都進(jìn)行了討論和分析,都參與了程序的編寫實(shí)驗(yàn)報(bào)告:PPT制作:矩陣及基本運(yùn)算(杜麗英)
教學(xué)目標(biāo)與要求使學(xué)生理解矩陣的概念。熟練掌握矩陣加法、數(shù)乘、乘法轉(zhuǎn)置及可逆矩陣的定義及它們滿足的運(yùn)算算律。
教學(xué)重點(diǎn)與難點(diǎn)教學(xué)重點(diǎn):矩陣的乘法運(yùn)算;可逆矩陣定義。教學(xué)難點(diǎn):矩陣的乘法。從變量線性變換的乘法引入矩陣乘法的定義。
教學(xué)方法與建議在引入矩陣的概念時(shí),通過幾個(gè)引例說明矩陣在生產(chǎn)實(shí)踐和日常生活中有廣泛的應(yīng)用。在講矩陣的基本運(yùn)算時(shí)使學(xué)生看到,有些運(yùn)算與數(shù)的運(yùn)算類似,有些則不然。特別是矩陣乘法不滿足交換律,消去律等。用學(xué)生熟悉的變量線性變換引入矩陣的乘法會(huì)使其定義更直觀,便于學(xué)生理解,對(duì)于矩陣乘法不滿足交換律、消去律除舉例說明外,還需進(jìn)一步說明有些冪指算律不成立,有零因子等。
教學(xué)過程設(shè)計(jì)1.矩陣概念的引入引例1:線性方程組的解取決于系數(shù)和常數(shù)項(xiàng),線性方程組的系數(shù)和常數(shù)按原位置可排為一個(gè)數(shù)表引例2:某航空公司在A,B,C,D四個(gè)城市之間開辟了若干條航線,如圖所示表示了四個(gè)城市間的航班圖,如果從A到B有航班,則用帶箭頭的線連接AB,從A指向B。某航空公司在A,B,C,D四城市之間開辟了若干航線,如圖所示表示了四城市間的航班圖,如果從A到B有ABCDA0110B1010C1001D0100四個(gè)城市間的航班圖情況也可用表格來表示,其中1表示有航班,0表示沒有航班。某航空公司在A,B,C,D四城市之間開辟了若干航線,如圖所示表示了四城市間的航班圖,引例3:甲、乙兩人玩石頭、剪子、布游戲,下面的表格反映甲的贏得情況,其中甲勝得1;甲輸?shù)猫C1;兩人相同為0。乙乙石頭剪子布石頭01-1剪子-101布1-10甲
甲2.矩陣的定義(1)定義1:由個(gè)數(shù)排成行列的數(shù)表用小括號(hào)或中括號(hào)將其括起來,稱為矩陣,并用一個(gè)大寫字母表示,即,簡(jiǎn)記為.①稱為的行列元素④稱為方陣②稱為實(shí)矩陣⑤稱為行矩陣或行向量③稱為復(fù)矩陣⑥稱為列矩陣或列向量(2)幾個(gè)特殊矩陣零矩陣:所有元素都是0的矩陣.即單位矩陣;數(shù)量矩陣對(duì)角矩陣上三角形矩陣;下三角形矩陣?yán)?:設(shè)變量可由變量表示為稱之為由變量到變量的線性變換,它與矩陣是一一對(duì)應(yīng)的.3.矩陣的基本運(yùn)算定義同型矩陣:指兩個(gè)矩陣對(duì)應(yīng)的行數(shù)相等、對(duì)應(yīng)的列數(shù)相等的矩陣.矩陣相等:設(shè),,若,稱.(1)線性運(yùn)算:,加法:數(shù)乘:負(fù)矩陣:減法:算律:設(shè)為同階矩陣,為常數(shù),則有①⑤②⑥③⑦④⑧例2設(shè),滿足,求.解(2)矩陣乘法:引入:設(shè)有兩個(gè)線性變換(Ⅰ)(Ⅱ)若想求出從到的線性變換,需將(Ⅱ)代入(Ⅰ),整理得(Ⅲ)分別比較(Ⅰ)、(Ⅱ)、(Ⅲ)式的矩陣,,線性變換(Ⅲ)稱為線性變換(Ⅰ)與(Ⅱ)的乘積,相應(yīng)的矩陣C稱為矩陣A與B的乘積,即C=AB,或=定義:設(shè),其中元素[注]的列數(shù)=的行數(shù)。的行數(shù)=的行數(shù);的列數(shù)=的列數(shù).與的先后次序不能改變.設(shè),則例4,,[注]無意義.例5,,[注];,,但是.算律:①結(jié)合律:②分配律:③④,應(yīng)用:設(shè),,,線性方程組的矩陣形式線性變換的矩陣形式(3)方陣的冪:,為正整數(shù),,算律:①②[注]一般例6,求.解:可以利用數(shù)學(xué)歸納法證得:(4)逆矩陣定義:對(duì)于,若有滿足,則稱為可逆矩陣,并把稱為的逆矩陣。(或性質(zhì):①若為可逆矩陣,則的逆矩陣唯一.并且記的逆為②.③,則.④與都可逆,則可逆,且.一般有規(guī)定:可逆,定義,,則有,(,為整數(shù))例7驗(yàn)證:與互為逆矩陣解:由于那么與互為逆矩陣。例8求解方程組,其中解:由例7知,于是即方程組的解為例9設(shè)方陣與滿足,試證可逆。證:由,有,即或于是則可逆,且例10證明當(dāng)時(shí),可逆,并且證:因,令那么,同理,因此可逆,并且應(yīng)用:(1)階線性方程組求解。設(shè),若可逆,則(2)求線性變換的逆變換。設(shè),若可逆,(3)矩陣方程求解。設(shè)可逆,可逆,且已知,則實(shí)驗(yàn)1矩陣運(yùn)算一實(shí)驗(yàn)?zāi)康氖煜ATLAB軟件中關(guān)于矩陣初等變換的方法以及矩陣運(yùn)算的各種命令。二實(shí)驗(yàn)內(nèi)容與要求1.啟動(dòng)與退出雙擊MATLAB圖標(biāo),進(jìn)入MATLAB命令窗口,即可輸入命令,開始運(yùn)算。單擊File菜單中的Exit,或使用MATLAB命令退出。數(shù)的輸入>>a=5回車:a=5輸入復(fù)數(shù)2—5i:b=2.0000-5.0000i問題1.1:輸入“>>a=5;”,回車后與上面有什么區(qū)別?在行尾加“;”,該行結(jié)果不顯示;在行尾加“,”或加“,”或不加標(biāo)點(diǎn),該行結(jié)果顯示。注意,在MATLAB中,標(biāo)點(diǎn)符號(hào)一定要在英文狀態(tài)下輸入!數(shù)組的輸入>>b=[1,3,5,7,9,11]>>c=1:2:11>>d=linspace(1,11,6)問題1.2:體會(huì)以上輸入放有什么區(qū)別和聯(lián)系。若b為在0~2pi之間均勻分布的22個(gè)數(shù)據(jù)c=(1.3,2.5,7.6,2,-3),d=(23,20,17,14,11,8,5,2),各用何種方法輸入比較簡(jiǎn)單?(3)矩陣的輸入>>A=[2,3,5;1,3,5;6,9,4]%行之間要用分號(hào)隔開A=235135694等待鍵盤輸入命令格式為:>>m=input(‘請(qǐng)輸入初始量,m=’);請(qǐng)輸入初始量,m=問題1.3:輸入A(2,3),結(jié)果如何?輸入A(7)又如何?體會(huì)以上輸入的結(jié)果,注意,數(shù)和數(shù)組可作為矩陣的特。注意:變量名開頭必須是英文字母,后面的字符可以是英文,數(shù)字和下劃線,但不包含空格和標(biāo)點(diǎn);6.5版變量名最長(zhǎng)可包含63個(gè)字符,以前的版本最多為31個(gè)字符;變量名,函數(shù)名對(duì)字母大小寫是區(qū)分的。3.矩陣的大小的測(cè)試和定位>>A=[3,5,6;2,5,8;3,5,9;3,7,9];>>d=numel(A)%測(cè)試定矩陣A的元素,5.x版本沒有此命令>>[n,m]=size(A)%測(cè)試A的行(n),列(m)數(shù)結(jié)果為:d=12n=4m=3>>[I,j]=find(A>3);%找出A中大于3的元素的行數(shù)注意:“%”后面是注釋句,被忽略而不執(zhí)行;對(duì)一個(gè)數(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的所有的元素?fù)Q為-3>>A=(2,:)=[]%刪除A的第2行ans=565979>>reshape(A,2,6)%返回以A的元素重新構(gòu)造的26維矩陣自找23個(gè)例子,熟悉數(shù)和數(shù)組的各種運(yùn)算,以及它們的各種函數(shù)值。自找23個(gè)例子,熟悉矩陣的加減乘除及其他運(yùn)算,注意和點(diǎn)運(yùn)算的區(qū)別。輸入一個(gè)矩陣A,取出A的第2行第1列的元素;取出A的第1,3,4列的所有元素;讓A的第1列和第3列互換;刪除A的第2列。產(chǎn)生3×4維的1矩陣,產(chǎn)生4×2維的隨機(jī)矩陣,產(chǎn)生4維的單位矩陣。將A的第2行元素?cái)U(kuò)大2倍,再增加3后作為A的第3行元素。輸入任意矩陣A,B(它們的元素個(gè)數(shù)相等),命令A(:)和A(:)=B會(huì)產(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,體會(huì)命令[A,B],[A,C],[A,B,D]所產(chǎn)生的結(jié)果,學(xué)習(xí)由小矩陣生成大矩陣的方法。四.提高內(nèi)容1.多維數(shù)組的創(chuàng)建格式:A=cat(n,A1,A2,…,Am).說明:n=1和n=2時(shí)分別構(gòu)造的[A1:A2]和[A1:A2],都是二維數(shù)組,而n=3時(shí)都可以構(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?!纠?.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分解,它的目的是將一個(gè)矩陣分解成一個(gè)下三角矩陣L和一個(gè)上三角矩陣U的乘積,將A=LU。格式:[L,U]=lu(X)%U為上三角陣,L為下三角陣或其變換形式,滿足LU=X,[L,U,P]=lu(X)%U為上三角陣,L為下三角陣,P為單位矩陣的行邊換滿足LU=PX。【例1.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分解成一個(gè)正交矩陣與一個(gè)上三角矩陣的乘積。格式:[Q,R]=qr(A)%求得正交矩陣Q和上三角陣R,Q和R滿足A=QR。[Q,R,E]=qr(A)%求得正交矩陣Q和上三角陣R,E為單位矩陣的變換形式,R的對(duì)角線元素按大小降序排列,滿足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;%擴(kuò)大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條對(duì)角線元素向量>>tril(A、k);%抽取矩陣A的第k條對(duì)角線下面的部分>>triu(A、k);%抽取矩陣A的第k條對(duì)角線上面的部分注意:“:”表示“全部”.5.矩陣的翻轉(zhuǎn)操作>>flipud(A);%A進(jìn)行上下翻轉(zhuǎn)>>fliplr(A);%A進(jìn)行左右翻轉(zhuǎn)>>rot90(A);%A逆時(shí)針旋轉(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維隨機(jī)矩陣(元素在9∽1之間)問題1.6:產(chǎn)生一個(gè)在區(qū)間[10,20]內(nèi)均勻分布的4階隨機(jī)矩陣.>>randn(m、n);%產(chǎn)生m╳n正態(tài)分布隨機(jī)矩陣>>randperm(n);%產(chǎn)生1∽n之間整數(shù)的隨機(jī)排列【例1.1】>>randperm(6)ans=321546>>logspace(a、b、n);%在(10a、10b)之間產(chǎn)生n個(gè)對(duì)數(shù)等分量>>diag(a、b、n);%產(chǎn)生以a、b、c、d、…為對(duì)角線元素的矩陣>>hilb(n);%返回n階hilbert矩陣,其元素為H(i、j)=1/(i+j-1)>>magic(n);%產(chǎn)生n階魔方矩陣7.數(shù)的運(yùn)算>>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的自然對(duì)數(shù),log10(4)是以10為底,log2(4)是以2為底8.矩陣的運(yùn)算>>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的對(duì)角線元素之和>>3*A;%常數(shù)與矩陣相乘>>A+B;%A,B必須是同維矩陣,和3+A進(jìn)行比較>>A-B;%A,B必須是同維矩陣,和3-A進(jìn)行比較>>A*B;%和A.*B進(jìn)行比較>>A/B;%(和A./B進(jìn)行比較)>>A\B;%(和A.\B進(jìn)行比較)>>A^2;%A^2相當(dāng)于A*A(和A.^2進(jìn)行比較)注意:矩陣的加減乘除按相關(guān)規(guī)則運(yùn)算,否則給出警告信息;“.*”,“./”,“.\”,“.^”稱為點(diǎn)運(yùn)算(或稱數(shù)組運(yùn)算,又稱元素群運(yùn)算),點(diǎn)運(yùn)算是前后矩陣對(duì)應(yīng)元素之間的運(yùn)算。問題1.7:求出A的本征矢量和本征值,比較2^4(A必須是方陣)和2.^A的區(qū)別.矩陣的其他運(yùn)算和函數(shù)見表1.3.9.變量的存儲(chǔ)與調(diào)用(1)存儲(chǔ)>>savedataabc%將變量a,b,c存到data.mat文件中(2)調(diào)用>>loaddata%data.mat文件中所有變量加載到工作空間10.列出工作空間所有變量>>whos%列出工作空間所有變量的變量名、大小、字節(jié)數(shù)、數(shù)組維數(shù)11.聯(lián)機(jī)求助>>helpsqrt%將顯示出平方根sqrt命令的功能和使用方式五、練習(xí)和思考①熟悉MATLAB的啟動(dòng)和退出.表1。1基本的數(shù)學(xué)函數(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對(duì)數(shù)函數(shù)log10常用對(duì)數(shù)函數(shù)abs絕對(duì)值函數(shù)angle角相位函數(shù)imag復(fù)數(shù)虛部函數(shù)real復(fù)數(shù)實(shí)部函數(shù)conj共軛復(fù)數(shù)函數(shù)sign正負(fù)符號(hào)函數(shù)fix朝零方向取整ceil朝正無窮方向取整round四舍五入取整floor朝無窮方向取整rem求余函數(shù)mod求余函數(shù)(帶符號(hào))gcd最大公約數(shù)lcm最小公倍數(shù)perms排列nchoosek組合表1.2特殊變量與函數(shù)函數(shù)名含義函數(shù)名含義ans默認(rèn)返回變量eps默認(rèn)相對(duì)浮點(diǎn)精度nargin函數(shù)輸入變量個(gè)數(shù)nargout函數(shù)輸出變量個(gè)數(shù)yarargin函數(shù)中輸入的可選參數(shù)varargout函數(shù)中輸出的可選參數(shù)i虛數(shù)單位pi圓周率inf無窮值nan不定值flnps浮點(diǎn)運(yùn)算次數(shù)inputname輸入?yún)?shù)名表1.3矩陣邊換和矩陣函數(shù)函數(shù)名含義函數(shù)名含義flipud矩陣上下翻轉(zhuǎn)fliplr矩陣左右翻轉(zhuǎn)rot90矩陣旋轉(zhuǎn)90°diag產(chǎn)生或提取對(duì)角陣tril產(chǎn)生或提取下三角陣triu產(chǎn)生或提取上三角陣eye產(chǎn)生單位矩陣rand產(chǎn)生隨機(jī)矩陣ones產(chǎn)生1矩陣zeros產(chǎn)生零矩陣linespace構(gòu)造線性分布向量logspace構(gòu)造對(duì)數(shù)分布向量det行列式的值eig矩陣的特征值trice矩陣的跡inv矩陣的逆rref化行最簡(jiǎn)形null零空間實(shí)驗(yàn)十三MATLAB在復(fù)變函數(shù)中的應(yīng)用一、實(shí)驗(yàn)?zāi)康模毫私釳atlab中有關(guān)復(fù)數(shù)的功能,能利用Matlab軟件計(jì)算復(fù)變函數(shù)中的相關(guān)問題。二、相關(guān)知識(shí)我們知道,復(fù)數(shù)由實(shí)部和虛部組成,表示為:,和為實(shí)數(shù),為虛單位。在Matlab中也采用這樣的方法來表示虛數(shù),只是有時(shí)也用來表示虛單位。我們可以在命令窗口直接輸入一個(gè)復(fù)數(shù)z=2+3*I,也可以用complex()命令來生成復(fù)數(shù)。用該命令還可生成復(fù)向量、復(fù)矩陣。例如: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)在我們來看一下有關(guān)復(fù)數(shù)的幾個(gè)命令:命令real(X)imag(X)angle(X)abs(X)conj(X)功能返回實(shí)部返回虛部返回輻角返回模返回共軛這些命令中的X均可以是復(fù)數(shù)、復(fù)向量、復(fù)矩陣。我們前面討論的四則運(yùn)算、解代數(shù)方程、求極限、求導(dǎo)數(shù)、求積分、級(jí)數(shù)展開等運(yùn)算,都可以運(yùn)用到復(fù)數(shù)上來。現(xiàn)在我們來看一下關(guān)于留數(shù)的計(jì)算。留數(shù)是復(fù)變函數(shù)中的一個(gè)重要概念,按照復(fù)變函數(shù)教材上的定義,函數(shù)在點(diǎn)的留數(shù)定義為:其中在區(qū)域內(nèi)解析,是的孤立奇點(diǎn),為圓周,。按照在的羅朗展開式,可以得到,即在的留數(shù)等于在的羅朗級(jí)數(shù)展開式中的系數(shù)。按照定義,我們固然可以通過求函數(shù)的羅朗級(jí)數(shù)的方法來求處函數(shù)在給定點(diǎn)的留數(shù),但是如果遇到較為復(fù)雜的函數(shù),要求留數(shù)并非一件易事,而Matlab為我們提供了一些計(jì)算工具。首先,對(duì)于分子分母均為多項(xiàng)式的函數(shù),Matlab有一個(gè)專門用于計(jì)算留數(shù)的函數(shù)residue(),其格式如下:[R,P,K]=residue(B,A)其中:參數(shù)B是由復(fù)變函數(shù)的分子的系數(shù)組成的向量,參數(shù)A是由復(fù)變函數(shù)的分母的系數(shù)組成的向量,例如,對(duì)于函數(shù),則,,參數(shù)是返回的留數(shù),是由不同奇點(diǎn)的留數(shù)組成的向量。參數(shù)是返回的極點(diǎn),也是一個(gè)向量,參數(shù)是個(gè)向量,由B/A的商的多項(xiàng)式系數(shù)組成,如果length(B)<length(A),則K為空向量,否則,length(K)=length(B)-length(A)+1。另外,函數(shù)residue()還可以根據(jù)已知的奇點(diǎn)P,奇點(diǎn)的留數(shù)R和K來計(jì)算分式復(fù)變函數(shù)的系數(shù)B和A,其格式如下:[B,A]=residue(R,P,K)其中參數(shù)的意義同前。例1:計(jì)算復(fù)變函數(shù)的留數(shù),然后根據(jù)計(jì)算的結(jié)果反求復(fù)變函數(shù)的分式表達(dá)式的系數(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:計(jì)算復(fù)變函數(shù)的留數(shù),然后根據(jù)計(jì)算的結(jié)果反求復(fù)變函數(shù)的分式表達(dá)式的系數(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當(dāng)復(fù)變函數(shù)的分子分母不是多項(xiàng)式時(shí),函數(shù)residue()就失效了,此時(shí),我們主要根據(jù)4個(gè)留數(shù)計(jì)算規(guī)則和一個(gè)定理來進(jìn)行留數(shù)的計(jì)算,這4個(gè)規(guī)則如下:(1)如果為的一級(jí)極點(diǎn),則;(2)如果為的級(jí)極點(diǎn),則;(3)設(shè),且和在點(diǎn)都解析,如果,,,那么為的一級(jí)極點(diǎn),則在的留數(shù)為:;(4)在無窮遠(yuǎn)點(diǎn)的留數(shù):定理是:如果在擴(kuò)充復(fù)平面內(nèi)只有有限個(gè)孤立奇點(diǎn),那么在所有奇點(diǎn)的留數(shù)的總和必定為零。例3:計(jì)算函數(shù)在點(diǎn)的留數(shù)。很明顯,和都是的一級(jí)極點(diǎn),所以使用第一個(gè)運(yùn)算法則較為合適。用以下程序可以算得結(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:計(jì)算函數(shù)在處的留數(shù)。我們可以看出在擴(kuò)充的復(fù)平面上有三個(gè)極點(diǎn):,,,根據(jù)計(jì)算留數(shù)的定理,在處的留數(shù)應(yīng)該等于其在和處留數(shù)的和,和又是的一級(jí)奇點(diǎn),所以有:,因此用以下的程序可以求解: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)三、實(shí)驗(yàn)內(nèi)容1.解方程組:;2.計(jì)算函數(shù)在點(diǎn)處的一階導(dǎo)數(shù);3.計(jì)算下列表達(dá)式在其奇點(diǎn)的留數(shù):(1);(2);(3);(4);4.把作為符號(hào),用函數(shù)Taylor將表達(dá)式進(jìn)行泰勒展開;5.完成實(shí)驗(yàn)報(bào)告。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目:稀疏矩陣運(yùn)算器年級(jí)班級(jí)姓名學(xué)號(hào)指導(dǎo)教師起止時(shí)間學(xué)期一、實(shí)驗(yàn)?zāi)康耐ㄟ^實(shí)習(xí),了解并初步掌握設(shè)計(jì)、實(shí)現(xiàn)較大系統(tǒng)的完整過程,包括系統(tǒng)分析、編碼設(shè)計(jì)、系統(tǒng)集成、以及調(diào)試分析,熟練掌握數(shù)據(jù)結(jié)構(gòu)的選擇、設(shè)計(jì)、實(shí)現(xiàn)以及操作方法,為進(jìn)一步的應(yīng)用開發(fā)打好基礎(chǔ)。二、問題描述(具體任務(wù))設(shè)計(jì)、實(shí)現(xiàn)兩個(gè)稀疏矩陣在十字鏈表表示方法下的相加、相減、相乘。稀疏矩陣是指那些多數(shù)元素為零的矩陣。利用稀疏特點(diǎn)進(jìn)行儲(chǔ)存和計(jì)算可以大大節(jié)省儲(chǔ)存空間,提高計(jì)算效率。實(shí)現(xiàn)一個(gè)能進(jìn)行稱稀疏矩陣基本運(yùn)算的運(yùn)算器。三、需求分析該程序所做的工作的是稀疏矩陣運(yùn)算器,實(shí)現(xiàn)兩個(gè)稀疏矩陣的基本運(yùn)算。此程序規(guī)定:1、按照壓縮存儲(chǔ)的概念,只存儲(chǔ)稀疏矩陣的非零元,以兩個(gè)三元組{i,j,e}來表示矩陣的非零元的行,列和數(shù)值,就確定了一個(gè)非零元.由此,稀疏矩陣可由表示非零元的三元數(shù)組及行列數(shù)確定2、用戶輸入數(shù)據(jù)作為三元組的行,列和非零元的個(gè)數(shù),用空格隔開.并輸入非零元的行,列和數(shù)值3、本程序只對(duì)兩個(gè)矩陣進(jìn)行四則運(yùn)算,所的結(jié)果矩陣應(yīng)該另生成,用十字鏈表存放,并放入新的矩陣中,只要對(duì)矩陣求解就能求出答案.四、算法設(shè)計(jì)思想及流程圖用十字鏈表存儲(chǔ)方式實(shí)現(xiàn)稀疏矩陣的基本運(yùn)算,此程序用到以下函數(shù):voidCreateSMatrix(CrossList&R)//創(chuàng)建儲(chǔ)存稀疏矩陣voidPrintSMatrix(CrossListR)//輸出十字鏈表的函數(shù)voidMultSMatrix(CrossListM,CrossListN,CrossList&Q)//實(shí)現(xiàn)矩陣乘法intAddMatrix(CrossListM,CrossListN,CrossList&Q)//實(shí)現(xiàn)矩陣加法intSubtSMatrix(CrossListM,CrossListN,CrossList&Q)//實(shí)現(xiàn)矩陣減法voidmain()//主函數(shù)調(diào)用以上函數(shù)來實(shí)現(xiàn)其功能:首先調(diào)用CreateSMatrix()創(chuàng)建矩陣M和N,并輸入稀疏矩陣的行數(shù),列數(shù),非零元素個(gè)數(shù),通過PrintSMatrix()輸出矩陣M和N,根據(jù)提示選擇相應(yīng)的運(yùn)算,當(dāng)進(jìn)行加或減運(yùn)算時(shí),如果兩個(gè)矩陣的行和列不相等時(shí),就無法得到結(jié)果,并出現(xiàn)提示錯(cuò)誤信息,當(dāng)進(jìn)行乘法運(yùn)算時(shí),要求矩陣M的列數(shù)必須等于矩陣N的行數(shù),否則無法進(jìn)行乘法運(yùn)算,為了進(jìn)行多種運(yùn)算通過主函數(shù)的Do----While循環(huán)來實(shí)現(xiàn),退出循環(huán)條件是輸入”+”、”-”、”*”以外的任意字符即可退出循環(huán)。五、C語(yǔ)言源代碼#include<stdio.h>#include<stdlib.h>#defineOVERFLOW-1#defineOK1#defineNULL0//建立十字鏈表typedefstructOLNode{introw,col;//該非零元的行和列下標(biāo)inte;structOLNode*right,*down;//該非零元所在行表和列表的后繼鏈域}OLNode,*OLink;typedefstruct{OLink*rhead,*chead;//行和列鏈表頭指針向量基址由CreateSMatrix分配intmu,nu,tu;//系數(shù)矩陣的行數(shù),列數(shù)和非零元個(gè)數(shù)}CrossList;//創(chuàng)建儲(chǔ)存稀疏矩陣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請(qǐng)輸入稀疏矩陣的行數(shù)列數(shù)非零元個(gè)數(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請(qǐng)輸入第%d個(gè)非零元的行號(hào)列號(hào)非零元素值:",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");}}//實(shí)現(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("這兩個(gè)矩陣不能相乘!");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()//實(shí)現(xiàn)矩陣加法intAddMatrix(CrossListM,CrossListN,CrossList&Q){/*初始條件:稀疏矩陣M與N的行數(shù)和列數(shù)對(duì)應(yīng)相等。*//*操作結(jié)果:求稀疏矩陣的差Q=M+N*/inti,k;OLinkp,pq,pm,pn;OLink*col;if(M.mu!=N.mu||M.nu!=N.nu){printf("兩個(gè)矩陣不是同類型的,不能相加\n");exit(OVERFLOW);}Q.mu=M.mu;/*初始化Q矩陣*/Q.nu=M.nu;Q.tu=0;/*元素個(gè)數(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é)點(diǎn)的數(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個(gè)結(jié)點(diǎn)*/pn=N.rhead[i];/*pn指向矩陣N的第i行的第1個(gè)結(jié)點(diǎn)*/while(pm&&pn)/*pm和pn均不空*/{if(pm->col<pn->col)/*矩陣M當(dāng)前結(jié)點(diǎn)的列小于矩陣N當(dāng)前結(jié)點(diǎn)的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?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當(dāng)前結(jié)點(diǎn)的列大于矩陣N當(dāng)前結(jié)點(diǎn)的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?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當(dāng)前結(jié)點(diǎn)的列相等且兩元素之差為0*/{pm=pm->right;/*pm指針向右移*/pn=pn->right;/*pn指針向右移*/continue;}if(Q.rhead[i]==NULL)/*p為該行的第1個(gè)結(jié)點(diǎn)*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個(gè)結(jié)點(diǎn))*/else/*插在pq所指結(jié)點(diǎn)之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個(gè)結(jié)點(diǎn)*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個(gè)結(jié)點(diǎn)*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->]所指結(jié)點(diǎn)之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個(gè)結(jié)點(diǎn)*/}}while(pm)/*將矩陣M該行的剩余元素插入矩陣Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?shù)加1*/p->row=i;/*給結(jié)點(diǎn)賦值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/if(Q.rhead[i]==NULL)/*p為該行的第1個(gè)結(jié)點(diǎn)*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個(gè)結(jié)點(diǎn))*/else/*插在pq所指結(jié)點(diǎn)之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個(gè)結(jié)點(diǎn)*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個(gè)結(jié)點(diǎn)*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->j]所指結(jié)點(diǎn)之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個(gè)結(jié)點(diǎn)*/}}while(pn)/*將矩陣N該行的剩余元素插入矩陣Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?shù)加1*/p->row=i;/*給結(jié)點(diǎn)賦值*/p->col=pn->col;p->e=+pn->e;p->right=NULL;pn=pn->right;/*pm指針向右移*/if(Q.rhead[i]==NULL)/*p為該行的第1個(gè)結(jié)點(diǎn)*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個(gè)結(jié)點(diǎn))*/else/*插在pq所指結(jié)點(diǎn)之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個(gè)結(jié)點(diǎn)*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個(gè)結(jié)點(diǎn)*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->j]所指結(jié)點(diǎn)之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個(gè)結(jié)點(diǎn)*/}}}for(k=1;k<=Q.nu;k++)if(col[k])/*k列有結(jié)點(diǎn)*/col[k]->down=NULL;/*令該列最后一個(gè)結(jié)點(diǎn)的down指針為空*/free(col);returnOK;}//實(shí)現(xiàn)矩陣減法intSubtSMatrix(CrossListM,CrossListN,CrossList&Q){/*初始條件:稀疏矩陣M與N的行數(shù)和列數(shù)對(duì)應(yīng)相等。*//*操作結(jié)果:求稀疏矩陣的差Q=M-N*/inti,k;OLinkp,pq,pm,pn;OLink*col;if(M.mu!=N.mu||M.nu!=N.nu){printf("兩個(gè)矩陣不是同類型的,不能相減\n");exit(OVERFLOW);}Q.mu=M.mu;/*初始化Q矩陣*/Q.nu=M.nu;Q.tu=0;/*元素個(gè)數(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é)點(diǎn)的數(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個(gè)結(jié)點(diǎn)*/pn=N.rhead[i];/*pn指向矩陣N的第i行的第1個(gè)結(jié)點(diǎn)*/while(pm&&pn)/*pm和pn均不空*/{if(pm->col<pn->col)/*矩陣M當(dāng)前結(jié)點(diǎn)的列小于矩陣N當(dāng)前結(jié)點(diǎn)的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?shù)加1*/p->row=i;/*給結(jié)點(diǎn)賦值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/}elseif(pm->col>pn->col)/*矩陣M當(dāng)前結(jié)點(diǎn)的列大于矩陣N當(dāng)前結(jié)點(diǎn)的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?shù)加1*/p->row=i;/*給結(jié)點(diǎn)賦值*/p->col=pn->col;p->e=-pn->e;p->right=NULL;pn=pn->right;/*pn指針向右移*/}elseif(pm->e-pn->e)/*矩陣M、N當(dāng)前結(jié)點(diǎn)的列相等且兩元素之差不為0*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?shù)加1*/p->row=i;/*給結(jié)點(diǎn)賦值*/p->col=pn->col;p->e=pm->e-pn->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/pn=pn->right;/*pn指針向右移*/}else/*矩陣M、N當(dāng)前結(jié)點(diǎn)的列相等且兩元素之差為0*/{pm=pm->right;/*pm指針向右移*/pn=pn->right;/*pn指針向右移*/continue;}if(Q.rhead[i]==NULL)/*p為該行的第1個(gè)結(jié)點(diǎn)*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個(gè)結(jié)點(diǎn))*/else/*插在pq所指結(jié)點(diǎn)之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個(gè)結(jié)點(diǎn)*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個(gè)結(jié)點(diǎn)*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->]所指結(jié)點(diǎn)之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個(gè)結(jié)點(diǎn)*/}}while(pm)/*將矩陣M該行的剩余元素插入矩陣Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?shù)加1*/p->row=i;/*給結(jié)點(diǎn)賦值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指針向右移*/if(Q.rhead[i]==NULL)/*p為該行的第1個(gè)結(jié)點(diǎn)*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個(gè)結(jié)點(diǎn))*/else/*插在pq所指結(jié)點(diǎn)之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個(gè)結(jié)點(diǎn)*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個(gè)結(jié)點(diǎn)*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->j]所指結(jié)點(diǎn)之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個(gè)結(jié)點(diǎn)*/}}while(pn)/*將矩陣N該行的剩余元素插入矩陣Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩陣Q的結(jié)點(diǎn)*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素?cái)?shù)加1*/p->row=i;/*給結(jié)點(diǎn)賦值*/p->col=pn->col;p->e=-pn->e;p->right=NULL;pn=pn->right;/*pm指針向右移*/if(Q.rhead[i]==NULL)/*p為該行的第1個(gè)結(jié)點(diǎn)*/Q.rhead[i]=pq=p;/*p插在該行的表頭且pq指向p(該行的最后一個(gè)結(jié)點(diǎn))*/else/*插在pq所指結(jié)點(diǎn)之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向該行的最后一個(gè)結(jié)點(diǎn)*/}if(Q.chead[p->col]==NULL)/*p為該列的第1個(gè)結(jié)點(diǎn)*/Q.chead[p->col]=col[p->col]=p;/*p插在該列的表頭且col[p->j]指向p*/else/*插在col[p->j]所指結(jié)點(diǎn)之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向該列的最后一個(gè)結(jié)點(diǎn)*/}}}for(k=1;k<=Q.nu;k++)if(col[k])/*k列有結(jié)點(diǎn)*/col[k]->down=NULL;/*令該列最后一個(gè)結(jié)點(diǎn)的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("如做加法,請(qǐng)輸入+,如做減法,請(qǐng)輸入-,如做乘法,請(qǐng)輸入*:\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);}六、測(cè)試分析(運(yùn)行結(jié)果)七、總結(jié)(收獲及體會(huì))通過此次的課程設(shè)計(jì)對(duì)十字鏈表存儲(chǔ)的稀疏矩陣更深一步的理解和認(rèn)識(shí),一開始我們從參考書上找來了課題,但是畢竟是參考書,做到后來發(fā)現(xiàn)很多程序都是不完整的,這讓我們傷透了腦筋??粗鴦e的小組都弄得有模有樣了,可是我們還沒有一點(diǎn)頭緒,好不容易又從網(wǎng)絡(luò)和參考書找到了相關(guān)信息,可是結(jié)果還是很不盡人意。程序都弄好了,調(diào)試也沒有問題,可是就是無法達(dá)到預(yù)期想要的結(jié)果。查閱的資料只是一個(gè)參考,最后還是要靠自己動(dòng)腦筋,然后我們大家一起齊心協(xié)力,雖然內(nèi)容并不是很復(fù)雜,但是我們覺得設(shè)計(jì)的過程相當(dāng)重要,學(xué)到了很多,收獲了很多。我覺得課程設(shè)計(jì)反映的是一個(gè)從理論到實(shí)際應(yīng)用的過程,但是更遠(yuǎn)一點(diǎn)可以聯(lián)系到以后畢業(yè)之后從學(xué)校轉(zhuǎn)到踏上社會(huì)的一個(gè)過程。小組人員的配合﹑相處,以及自身的動(dòng)腦和努力,都是以后工作中需要的。八、參考文獻(xiàn)數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)嚴(yán)蔚敏吳偉明編著清華大學(xué)出版社五、調(diào)試分析1、本程序中相乘部分較易,但是相加的部分則是讓人傷腦筋,但最還仔細(xì)分析還是可以實(shí)現(xiàn)的。2、在用十字鏈表表示稀疏矩陣時(shí),相加或相減所得的結(jié)果應(yīng)該另生成,乘積矩陣也可用二維數(shù)組表示。3、通過數(shù)據(jù)的測(cè)試,能按要求實(shí)現(xiàn)功能。安徽理工大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說明書題目:稀疏矩陣的運(yùn)算院系:計(jì)算機(jī)科學(xué)與工程學(xué)院專業(yè)班級(jí):計(jì)算機(jī)10-*班學(xué)號(hào):202130****學(xué)生姓名:******指導(dǎo)教師:2021年12月28日安徽理工大學(xué)課程設(shè)計(jì)(論文)任務(wù)書計(jì)算機(jī)科學(xué)與工程學(xué)院2021年11月8日安徽理工大學(xué)課程設(shè)計(jì)(論文)成績(jī)?cè)u(píng)定表目錄1問題描述............................................12需求分析............................................13總體設(shè)計(jì)............................................23.1Matrix結(jié)構(gòu)的定義................................23.2系統(tǒng)流程圖......................................34詳細(xì)設(shè)計(jì)............................................44.1“菜單”界面....................................44.2建立矩陣........................................44.3顯示矩陣..........................
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備拆除安全管理制度
- 設(shè)備檢測(cè)檢查管理制度
- 設(shè)備維護(hù)電池管理制度
- 設(shè)備設(shè)施控制管理制度
- 設(shè)計(jì)單位考勤管理制度
- 診室醫(yī)院感染管理制度
- 診所消防制度管理制度
- 診斷影像設(shè)備管理制度
- 調(diào)研法官助理管理制度
- 財(cái)務(wù)風(fēng)險(xiǎn)制度管理制度
- 10kV~500kV輸變電及配電工程質(zhì)量驗(yàn)收與評(píng)定標(biāo)準(zhǔn):06變電自動(dòng)化工程
- 高三家長(zhǎng)會(huì)班主任發(fā)言稿課件
- 學(xué)前幼兒園-《快樂的小鼴鼠》教學(xué)課件設(shè)計(jì)
- 3停止間轉(zhuǎn)法教案
- 四川省綿陽(yáng)市2021年中考生物考試真題與答案解析
- 世界史階段特征課件
- 2022-2023學(xué)年重慶市合川市三下數(shù)學(xué)期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含解析
- 山東開放大學(xué)公共部門人力資源管理期末復(fù)習(xí)題
- 《園林植物識(shí)別與應(yīng)用》項(xiàng)目七:綜合課業(yè)題庫(kù)及答案
- 人民醫(yī)院腫瘤科臨床技術(shù)操作規(guī)范2023版
- 物業(yè)承接查驗(yàn)辦法培訓(xùn)
評(píng)論
0/150
提交評(píng)論