西工大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告 矩陣運(yùn)算

上傳人:nu****n 文檔編號(hào):145272781 上傳時(shí)間:2022-08-29 格式:DOC 頁數(shù):11 大小:349.52KB
收藏 版權(quán)申訴 舉報(bào) 下載
西工大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告 矩陣運(yùn)算_第1頁
第1頁 / 共11頁
西工大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告 矩陣運(yùn)算_第2頁
第2頁 / 共11頁
西工大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告 矩陣運(yùn)算_第3頁
第3頁 / 共11頁

下載文檔到電腦,查找使用更方便

9.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《西工大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告 矩陣運(yùn)算》由會(huì)員分享,可在線閱讀,更多相關(guān)《西工大數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告 矩陣運(yùn)算(11頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、《數(shù)據(jù)結(jié)構(gòu)》實(shí)驗(yàn)報(bào)告 一.實(shí)驗(yàn)題目 必做:稀疏矩陣轉(zhuǎn)置、加法(行邏輯鏈接表) 選做:稀疏矩陣乘法 二.程序設(shè)計(jì) (一) 需求分析 1.程序運(yùn)行步驟: (1)開始; (2)選擇要進(jìn)行的運(yùn)算:1.矩陣轉(zhuǎn)置2.矩陣加法3.矩陣乘法; (3)選擇矩陣運(yùn)算后,輸入矩陣; (4)對(duì)矩陣進(jìn)行相應(yīng)的運(yùn)算; (5)輸出運(yùn)算結(jié)果; (6)結(jié)束。 (二)概要設(shè)計(jì) 程序模塊及思想: 1.主函數(shù) 主函數(shù)的主體是一個(gè)switch選擇結(jié)構(gòu)。內(nèi)部分為三種情況:矩陣轉(zhuǎn)置、矩陣加法和矩陣乘法。 (1) 矩陣轉(zhuǎn)置運(yùn)算: (1) 輸入矩陣; (2) 輸出這個(gè)矩陣; (3) 轉(zhuǎn)置這個(gè)矩陣

2、; (4) 輸出轉(zhuǎn)置后的結(jié)果; (5) 結(jié)束。 (2) 矩陣加法運(yùn)算: (1) 輸入矩陣A和矩陣B; (2) 輸出這兩個(gè)矩陣; (3) 將兩個(gè)矩陣相加; (4) 輸出相加后的結(jié)果; (5) 結(jié)束。 (3) 矩陣乘法運(yùn)算: (1)輸入矩陣A和矩陣B; (2)輸出這兩個(gè)矩陣; (3)將兩個(gè)矩陣相加; (4)輸出相加后的結(jié)果; (5)結(jié)束。 2.基本操作。 typedef struct { int i,j; ElemType e; }Triple; 操作結(jié)果:定義三元組 typedef struct {

3、 Triple data[MAXSIZE+1]; int mu,nu,tu,cnum[MAXSIZE+1],rnum[MAXSIZE+1],cpot[MAXSIZE+1],rpos[MAXSIZE+1]; //某一列非零元的個(gè)數(shù),某一行非零元的個(gè)數(shù),某一列第一個(gè)非零元在b.data中的位置,某一行非零元在b.data中的位置 }TSMatrix; 操作結(jié)果:定義稀疏矩陣 int GetSMatrix(TSMatrix &t) 操作結(jié)果:創(chuàng)建稀疏矩陣,以三元組表形式儲(chǔ)存 int TransposeSMatrix(TSMatrix M,TSMat

4、rix &T) 操作結(jié)果:轉(zhuǎn)置矩陣 int PrintSMatrix(TSMatrix t) 操作結(jié)果:輸出矩陣 int AddSMatrix(TSMatrix t,TSMatrix s,TSMatrix &a) 操作結(jié)果:矩陣相加 (三)詳細(xì)設(shè)計(jì) 1.結(jié)構(gòu)體定義 typedef struct { int i,j; //行,列 ElemType e; //非零元素的值 }Triple; 操作結(jié)果:定義三元組 typedef struct { Triple data[MAXSIZE+1]; int

5、 mu,nu,tu,cnum[MAXSIZE+1],rnum[MAXSIZE+1],cpot[MAXSIZE+1],rpos[MAXSIZE+1]; //行數(shù),列數(shù),非零元素個(gè)數(shù),某一列非零元的個(gè)數(shù),某一行非零元的個(gè)數(shù),某一列第一個(gè)非零元在b.data中的位置,某一行非零元在b.data中的位置 }TSMatrix; 操作結(jié)果:定義稀疏矩陣 2.每個(gè)模塊的分析: (1) 主程序模塊: int main() { int k; TSMatrix t,s,a; printf("請(qǐng)輸入需要執(zhí)行的操作的序號(hào):(1.矩陣轉(zhuǎn)置 2.矩陣相加 3.

6、矩陣乘法)\n"); scanf("%d",&k); switch(k) { case(1): { GetSMatrix(t); //轉(zhuǎn)置模塊 printf("輸入的矩陣為:\n"); PrintSMatrix(t); TransposeSMatrix(t,s); printf("轉(zhuǎn)置后的矩陣為:\n"); PrintSMatrix(s); }break; case(2): { printf("請(qǐng)依次輸入兩個(gè)矩陣\n"); //加法

7、模塊 GetSMatrix(t); printf("\n\n"); GetSMatrix(s); printf("輸入的兩個(gè)矩陣分別為:\n"); printf("矩陣a:\n"); PrintSMatrix(t); printf("矩陣b:\n"); PrintSMatrix(s); if(t.mu!=s.mu||t.nu!=s.nu) printf("ERROR"); else { AddSMatrix(t,s,a); printf("相加后的矩陣為:\n"); PrintSMatri

8、x(a); } } break; case(3): { printf("請(qǐng)依次輸入兩個(gè)矩陣\n"); //乘法模塊 GetSMatrix(t); printf("\n\n"); GetSMatrix(s); printf("輸入的兩個(gè)矩陣分別為:\n"); printf("矩陣a:\n"); PrintSMatrix(t); printf("矩陣b:\n"); PrintSMatrix(s); if(t.nu!=s.mu) printf("ERROR\n"); else

9、{ MultSMatrix(t,s,a); printf("相乘后的矩陣為:\n"); PrintSMatrix(a); } } break; return 0; } } (2) 基本操作函數(shù): (1) 矩陣的創(chuàng)建: int GetSMatrix(TSMatrix &t) { //創(chuàng)建稀疏矩陣,以三元組表形式儲(chǔ)存 int i,k; um[0]=0; t.cpot[0]=1; t.rnum[0]=0,t.rpos[0]=1; //第零列非零元的個(gè)數(shù),第零行非零元的個(gè)數(shù),第零列第一個(gè)非零元在b.data

10、中的位置,第零行非零元在b.data中的位置等參數(shù)的初始值為零 printf("請(qǐng)輸入矩陣的行數(shù)、列數(shù)以及非零元個(gè)數(shù):\n"); scanf("%d %d %d",&t.mu,&t.nu,&t.tu); printf("請(qǐng)依次輸入%d個(gè)非零元的行數(shù)、列數(shù)以及非零元的值:\n",t.tu); for (i=1;i<=t.tu;i++) { scanf("%d %d %d",&t.data[i].i,&t.data[i].j,&t.data[i].e); //輸入每個(gè)非零元素的行坐標(biāo),列坐標(biāo)和值 } for(i=1;i<=t.nu;i++)

11、 { t.cpot[i]=t.cpot[i-1]+um[i-1]; //某一列第一個(gè)非零元素在t.data中的位置等于上一列第一個(gè)非零元在t.data中的位置加上上一列的非零元個(gè)數(shù) um[i]=0; //這一列非零元的個(gè)數(shù)初始值為零 for(k=1;k<=t.tu;k++) if(t.data[k].j==i) um[i]+=1; //求這一列非零元的個(gè)數(shù) } for(i=1;i<=t.mu;i++) { t.rpos[i]=t.rpos[i-1]+t.rnum[i-1]; //某一行第一個(gè)非零元在t.data的位置

12、等于上一行第一個(gè)非零元在t.data中的位置加上上一行的非零元個(gè)數(shù) t.rnum[i]=0; //這一行非零元的個(gè)數(shù)初始值為零 for(k=1;k<=t.tu;k++) if(t.data[k].i==i) t.rnum[i]+=1; //求這一行非零元的個(gè)數(shù) } return OK; } (2)矩陣的轉(zhuǎn)置 int TransposeSMatrix(TSMatrix M,TSMatrix &T) { //轉(zhuǎn)置矩陣 T.mu=M.nu; //T的行數(shù)與M的列數(shù)相同 T.nu=M.mu;

13、 //T的列數(shù)與M的列數(shù)相同 T.tu=M.tu; int col,p,q; if(T.tu){ q=1; for(col=1;col<=M.nu;++col) for(p=1;p<=M.tu;++p) if(M.data[p].j == col){ T.data[q].i = M.data[p].j; //將轉(zhuǎn)置后的矩陣M的賦值給T T.data[q].j = M.data[p].i; T.data[q].e = M.data[p].e; ++q; } } return OK

14、; } (3) 矩陣的加法: int AddSMatrix(TSMatrix t,TSMatrix s,TSMatrix &a) { //矩陣相加 int i,k,j,q=1; a.mu=t.mu; a.nu=t.nu; a.tu=0; //S,T矩陣的行列必須相同 for(i=1;i<=t.mu;i++) { k=t.rpos[i]; j=s.rpos[i]; //k,j分別等于每一列第一個(gè)非零元在的T.data和s.data中的位置 if(i==t.mu) {

15、 //如果i等于行數(shù) t.rpos[i+1]=t.rpos[i]+t.tu-k+1; //下一行第一個(gè)非零元在t.data中的位置等于總非零元的個(gè)數(shù)加一 s.rpos[i+1]=s.rpos[i]+s.tu-j+1; //求下一行第一個(gè)非零元在s.data中的位置 } while(k

16、f(t.data[k].j

17、=i; a.data[q].j=s.data[j].j; a.data[q].e=s.data[j].e; q++;j++; a.tu++; } } else { //當(dāng)T與S列行坐標(biāo)相等時(shí) a.data[q].i=i; a.data[q].j=t.data[k].j; a.data[q].e=t.data[k].e+s.data[j].e; q++; k++;

18、//相加 j++; a.tu++; } } while(k

19、i; a.data[q].j=s.data[j].j; // a.data[q]賦值為s.data[q] a.data[q].e=s.data[j].e; q++; j++; a.tu++; } } return OK; } (4) 矩陣的乘法 int MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q){ int arow,brow,ccol,ctemp[MAXSIZE+1],tp,t,p,q,i; if(M.nu!=N.mu) return E

20、RROR; Q.mu=M.mu; Q.nu=N.nu; //確定矩陣的參數(shù) Q.tu=0; if(M.tu*N.tu!=0){ for(arow=1;arow<=M.mu;++arow){ for(i=1;i<=N.nu;i++) ctemp[i]=0; //累加器清零 Q.rpos[arow] = Q.tu+1; //每一個(gè)Q.rpos[arow]賦相同的初值Q.tu+1。

21、 if(arow

22、 //遍歷M的一行元素,[M.rpos[arow],tp],驅(qū)動(dòng)元素M.data[p] brow=M.data[p].j; if(brow

23、col]+=M.data[p].e*N.data[q].e; } } for(ccol=1;ccol<=Q.nu;++ccol) if(ctemp[ccol]){ //新的矩陣 if(++Q.tu > MAXSIZE) return ERROR; Q.data[Q.tu].i=arow; Q.data[Q.tu].j=ccol; Q.data[Q.tu].e=ctemp[ccol];

24、 } } } return OK; } (四) 程序使用說明及測試結(jié)果 程序運(yùn)行截圖如下: 1.矩陣轉(zhuǎn)置 (2)矩陣加法: (3)矩陣乘法: (五)、實(shí)驗(yàn)總結(jié)(實(shí)驗(yàn)心得) 1.你在編程過程中花時(shí)多少? 答:從設(shè)計(jì)到編寫,從調(diào)試到完成,直至最終完成實(shí)驗(yàn)報(bào)告一共用了約八個(gè)小時(shí)。 2.多少時(shí)間在紙上設(shè)計(jì)? 答:兩個(gè)小時(shí)。 3.多少時(shí)間上機(jī)輸入和調(diào)試? 答:四個(gè)多小時(shí)。 4.多少時(shí)間在思考問題? 答:設(shè)計(jì)前就思考,直至完成報(bào)告,十個(gè)小時(shí)。 5.遇到了哪些難題?又是怎么克服的?

25、 答:答:在做這項(xiàng)作業(yè)時(shí)。我可以說自己遇到了無數(shù)難題,以為我的C語言成績并不好,棧的熟悉度恐怕只有10%。因此完成這項(xiàng)作業(yè)的過程可謂艱辛。 首先遇到的困難就是設(shè)計(jì)程序。去年C語言學(xué)得很不扎實(shí),我對(duì)三元組的結(jié)構(gòu)都不甚了解,更別說運(yùn)用與之相關(guān)的算法了。在設(shè)計(jì)程序之前:我花了很長時(shí)間復(fù)習(xí)書上與之相關(guān)的算法。在周五下午數(shù)據(jù)結(jié)構(gòu)的實(shí)驗(yàn)課上,我又將數(shù)據(jù)結(jié)構(gòu)書上的算法仔細(xì)分析了一遍。由于知識(shí)的匱乏,我只能先將書上的三元組稀疏矩陣有關(guān)的算法逐句逐句的分析,?然后在紙上設(shè)計(jì)相應(yīng)的流程。最后憑借自己的知識(shí),并利用同學(xué)的幫助,磕磕絆絆地編寫了程序。 接下來的困難,也就是最大,最麻煩,解決起來最耗費(fèi)腦力,最枯燥乏

26、味的問題——調(diào)試程序。最初的程序編譯之后,問題觸目驚心,我根據(jù)系統(tǒng)的提示,首先補(bǔ)上了缺失的間隔符,又定義了遺漏的變量,再次編譯,錯(cuò)誤有所減少,但依然多,我又重新修改。接下來的錯(cuò)誤越來越“高級(jí)”,數(shù)據(jù)類型,返回類型,函數(shù)類型等有關(guān)。我便循環(huán)往復(fù),不厭其煩地修改,每當(dāng)減少一個(gè)錯(cuò)誤,我都會(huì)有幾分高興,而有的時(shí)候,修改后會(huì)產(chǎn)生更多的錯(cuò)誤。 就這樣一遍又一遍,終于系統(tǒng)顯示沒有錯(cuò)誤和警告了。我運(yùn)行了程序。當(dāng)我按照自己的設(shè)想將輸入數(shù)據(jù)時(shí),敲下回車鍵后結(jié)果卻令我傻了眼。屏幕上沒有任何顯示。,原來許多錯(cuò)誤是編譯器沒有檢測出來。 最終通過我的調(diào)試,修改和同學(xué)的幫助,終于完成了程序。 ??? 6.你的收獲有哪些? 答:首先,我對(duì)稀疏矩陣的知識(shí)有了更多了解破除了錯(cuò)誤的認(rèn)識(shí)。 其次,通過這次作業(yè),我掌握了幾種與稀疏矩陣有關(guān)的算法。 最后,我還溫習(xí)了有關(guān)C語言的許多知識(shí)。 參考文獻(xiàn):【1】嚴(yán)蔚敏?《數(shù)據(jù)結(jié)構(gòu)?第三章》清華大學(xué)出版社

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲