矩陣轉(zhuǎn)置與相加實(shí)驗(yàn)報(bào)告_第1頁(yè)
矩陣轉(zhuǎn)置與相加實(shí)驗(yàn)報(bào)告_第2頁(yè)
矩陣轉(zhuǎn)置與相加實(shí)驗(yàn)報(bào)告_第3頁(yè)
矩陣轉(zhuǎn)置與相加實(shí)驗(yàn)報(bào)告_第4頁(yè)
矩陣轉(zhuǎn)置與相加實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

..實(shí)驗(yàn)內(nèi)容和要求稀疏矩陣A,B均采用三元組表示,驗(yàn)證實(shí)現(xiàn)矩陣A快速轉(zhuǎn)置算法,設(shè)計(jì)并驗(yàn)證A,B相加得到矩陣C的算法。從鍵盤輸入矩陣的行數(shù)和列數(shù),隨機(jī)生成稀疏矩陣。設(shè)計(jì)算法將隨機(jī)生成的稀疏矩陣轉(zhuǎn)換成三元組順序表示形式存儲(chǔ)。設(shè)計(jì)算法將快速轉(zhuǎn)置得到的與相加得到的三元組順序表分別轉(zhuǎn)換成矩陣形式。輸出隨機(jī)生成的稀疏矩陣A,B及其三元組順序表、快速轉(zhuǎn)置得到的與相加得到的三元組順序表及其矩陣形式。實(shí)驗(yàn)過程及結(jié)果 需求分析1、將隨機(jī)生成的數(shù)定義為int型〔為方便起見設(shè)定范圍為-20至20〔不含0,可修改,三元組存儲(chǔ)的元素分別為非零元的行下標(biāo)、列下標(biāo)及該位置的元素值,零元不進(jìn)行存儲(chǔ)。實(shí)際上在生成稀疏矩陣時(shí)是隨機(jī)選取一些位置生成非零元然后存入三元組中。2、從鍵盤輸入矩陣的行數(shù)和列數(shù)后應(yīng)能輸出三元組順序表及相應(yīng)矩陣〔按行和列排列形式輸出。3、程序能實(shí)現(xiàn)的功能包括:=1\*GB3①隨機(jī)產(chǎn)生稀疏矩陣;=2\*GB3②輸出陣列形式的矩陣;=3\*GB3③輸出三元組順序表;=4\*GB3④將矩陣快速轉(zhuǎn)置;=5\*GB3⑤將兩個(gè)稀疏矩陣相加生成新的矩陣。概要設(shè)計(jì)1、稀疏矩陣的抽象數(shù)據(jù)類型定義:ADTTSMatrix{數(shù)據(jù)對(duì)象:D={aij|i=1,2,…,m,j=1,2,…,n;Ai,j∈ElemSet,m和n分別稱為矩陣的行數(shù)和列數(shù)}數(shù)據(jù)關(guān)系:R={Row,Col}Row={<ai,j,ai,j+1>|1≤i≤m,1≤j≤n-1}Col={<ai,j,ai+1,j>|1≤i≤m-1,1≤j≤n}基本操作:CreateTSMatrix<&M>操作結(jié)果:創(chuàng)建矩陣MPrintTSMatrix<M>初始條件:矩陣M已存在操作結(jié)果:輸出矩陣M中三元組形式的非零元素PrintTSMatrix1<M>初始條件:矩陣M已存在操作結(jié)果:以陣列形式輸出矩陣UnZore<M,row,col>初始條件:矩陣M已存在操作結(jié)果:若位置<row,col>處存在非零元素,則返回該元素存儲(chǔ)在矩陣中的序號(hào)TSMatrix_Add<M,N,&Q>初始條件:矩陣M,N已存在操作結(jié)果:將矩陣M,N相加得到Q并返回矩陣QFastTransposeSMatrix<M,&N>初始條件:矩陣M已存在操作結(jié)果:將矩陣M快速轉(zhuǎn)置得到轉(zhuǎn)置矩陣N并返回}ADTTSMatrix;⒊本程序模塊結(jié)構(gòu)⑴主函數(shù)模塊voidmain<>{初始化迷矩陣;創(chuàng)建矩陣并輸出;將矩陣轉(zhuǎn)置并輸出;將矩陣相加并輸出結(jié)果;}三、詳細(xì)設(shè)計(jì)1、基本數(shù)據(jù)類型操作⑴typedefintElemType;typedefstruct{inti,j;ElemTypee;}Triple;//數(shù)據(jù)類型三元組typedefstruct{Tripledata[maxsize+1];//矩陣大小intmu,nu,tu; //}TSMatrix;//矩陣抽象數(shù)據(jù)類型2、參數(shù)設(shè)置:#definemaxsize10000//----------基本操作的算法描述--------------------StatusCreateTSMatrix<TSMatrix*M>{//創(chuàng)建一個(gè)隨機(jī)矩陣〔data[0]未用srand<<int>time<NULL>>; printf<"PleaseInputTheLinesAndColumnsOfTheMatrix:\n">; printf<"...<矩陣的期望規(guī)格大于4*5<或5*4>>...\n">;scanf<M->mu,M->nu>;for<m=0;m<M->mu;m++>{for<n=0;n<M->nu;n++>{ k[m][n]=rand<>%20; if<k[m][n]==0>{ if<rand<>%2> M->data[p].e=rand<>%20+1; else M->data[p].e=rand<>%20-20; M->data[p].i=m+1; M->data[p].j=n+1; p++; }}}M->tu=p-1; //p從1開始,非零元個(gè)數(shù)剛好等于p-1returnOK;}voidPrintTSMatrix<TSMatrixM>{//輸出矩陣的三元組順序表 if<M.tu==0> printf<"無(wú)非零元!\n">; else{ printf<"該矩陣的行數(shù)為%d、列數(shù)為%d、非零元素個(gè)數(shù)為%d.\n非零元的坐標(biāo)及值:\n\n",M.mu,M.nu,M.tu>; printf<"行列元素值\n">; for<i=1;i<=M.tu;i++>{ printf<"%4d%4d%6d\n",M.data[i].i,M.data[i].j,M.data[i].e>; } printf<"\n">; }}voidPrintTSMatrix1<TSMatrixM>{//輸出矩陣的陣列形式 printf<"陣列形式為:\n">;for<i=1;i<=M.mu;i++>{for<j=1;j<=M.nu;j++>if<k<M.tu&&p->i==i&&p->j==j>{ printf<"%4d",p->e>;//data[0]未用,p從data[1]開始p++;k++;}elseprintf<"%4d",0>;printf<"\n">;} printf<"\n">;}intUnZore<TSMatrixM,introw,intcol>{ while<order<=M.tu>{ if<M.data[order].i==row&&M.data[order].j==col>//order從1開始 returnorder; order++; } return0;}StatusTSMatrix_Add<TSMatrixM,TSMatrixN,TSMatrix*Q>{//矩陣相加得到新的矩陣,order從1開始 if<M.mu==N.mu&&M.nu==N.nu>{ for<row=1;row<=M.mu;row++>{ for<col=1;col<=M.nu;col++>{ order1=UnZore<M,row,col>; order2=UnZore<N,row,col>; if<order1&&order2>{ Q->data[order].i=row; Q->data[order].j=col; Q->data[order].e=M.data[order1].e+N.data[order2].e; order++; } elseif<order1&&<!order2>>{ Q->data[order].e=M.data[order1].e; Q->data[order].i=M.data[order1].i; Q->data[order].j=M.data[order1].j; order++; } elseif<<!order1>&&order2>{ Q->data[order].e=N.data[order2].e; Q->data[order].i=N.data[order2].i; Q->data[order].j=N.data[order2].j; order++; } } } Q->mu=M.mu; Q->nu=M.nu; Q->tu=order-1; returnOK; } else{ printf<"\n不是同型矩陣不能進(jìn)行相加!\n">; returnERROR; }}StatusFastTransposeSMatrix<TSMatrixM,TSMatrix*N>{//采用三元組順序表存儲(chǔ)表示,求稀疏矩陣M的轉(zhuǎn)置矩陣NN->mu=M.nu;N->nu=M.mu;N->tu=M.tu;if<N->tu>{for<i=1;i<=M.nu;++i>num[i]=0;for<t=1;t<=M.tu;++t>++num[M.data[t].j];//求M中每一列非零元個(gè)數(shù)cpot[1]=1; //求第col列中第一個(gè)元素在b.data中的序號(hào)for<i=2;i<=M.nu;++i>cpot[i]=cpot[i-1]+num[i-1];for<p=1;p<=M.tu;++p>{i=M.data[p].j;q=cpot[i];N->data[q].i=M.data[p].j;N->data[q].j=M.data[p].i;N->data[q].e=M.data[p].e;++cpot[i];}}returnOK;}⑶主函數(shù)算法:voidmain<>{TSMatrixA,A1,B,C;printf<"矩陣A:\n">;CreateTSMatrix<&A>;PrintTSMatrix<A>;PrintTSMatrix1<A>;printf<"由矩陣A轉(zhuǎn)置得矩陣A1...\n">;FastTransposeSMatrix<A,&A1>;PrintTSMatrix<A1>;PrintTSMatrix1<A1>;printf<"矩陣B:\n">;CreateTSMatrix<&B>;PrintTSMatrix<B>;PrintTSMatrix1<B>;printf<"矩陣A加矩陣B得到矩陣C...\n">;if<TSMatrix_Add<A,B,&C>>{ PrintTSMatrix<C>; PrintTSMatrix1<C>;}}四、調(diào)試分析1、三元組順序表的輸出順序應(yīng)該是先按行排序再按列排序,即行主序,依次輸出。2、生成的非零元應(yīng)該有正數(shù)和負(fù)數(shù),選取在-20到20之間的數(shù)〔不包括0,生成隨機(jī)數(shù)時(shí)同時(shí)隨機(jī)生成其正負(fù)號(hào),為正數(shù)時(shí)將rand<>%20再加1,避免再產(chǎn)生0,為負(fù)數(shù)時(shí)將rand<>%20-20。3、由于稀疏矩陣非零元個(gè)數(shù)極少,故要求矩陣規(guī)格在4*5〔或5*4以上為好,實(shí)際上生成非零元時(shí)其位置具備隨機(jī)性,其個(gè)數(shù)也具備隨機(jī)性,并不嚴(yán)格小于等于矩陣元素個(gè)數(shù)的5%,因?yàn)榭刂破潆S機(jī)位置的是通過rand<>%20,當(dāng)該隨機(jī)數(shù)值為0時(shí),將該位置做為非零元位置。開始時(shí)采取隨機(jī)生成位置以便控制非零元個(gè)數(shù)小于等于矩陣元素個(gè)數(shù)的5%,但是這樣就不便于將非零元按行列次序存儲(chǔ),而是誰(shuí)先生成就先存儲(chǔ)誰(shuí),也無(wú)法避免出現(xiàn)重復(fù)位置的情況。4、實(shí)驗(yàn)沒有采取二維數(shù)組的方法來形成矩陣,而是直接用三元組存儲(chǔ)的,在輸出時(shí)通過for循環(huán)控制則可輸出實(shí)現(xiàn)陣列形式的矩陣。用戶說明與測(cè)試結(jié)果本程序的運(yùn)行環(huán)境為windows7〔64位操作系統(tǒng),執(zhí)行文件為矩陣.exe;2、進(jìn)入演示程序后,即顯示對(duì)話形式的提示操作過程, 〔1提出輸入矩陣的大小〔2按enter鍵輸出隨機(jī)生成的矩陣三元組順序表和整個(gè)矩陣如圖所示:〔3程序自動(dòng)完成第一個(gè)矩陣的轉(zhuǎn)置并輸出;〔4提示輸入矩陣B后,用戶輸入所需矩陣的行數(shù)和列數(shù),然后程序?qū)⒆詣?dòng)完成兩個(gè)原始矩陣的相加,若不是同型矩陣則提示無(wú)法相加。如圖所示:五、附錄〔源代碼及注釋#include<stdio.h>#include<stdlib.h>#include"time.h"#definemaxsize10000#defineOK1#defineERROR0#defineTRUE1#defineFALSE0#defineOVERFLOW-1typedefintElemType;typedefintStatus;typedefstruct{inti,j;ElemTypee;}Triple;//數(shù)據(jù)類型三元組typedefstruct{Tripledata[maxsize+1];//矩陣大小intmu,nu,tu; //}TSMatrix;//矩陣抽象數(shù)據(jù)類型StatusCreateTSMatrix<TSMatrix*M>; //創(chuàng)建矩陣voidPrintTSMatrix<TSMatrixM>; //輸出矩陣非零元素voidPrintTSMatrix1<TSMatrixM>; //以陣列形式輸出矩陣intUnZore<TSMatrixM,introw,intcol>; //判斷位置<row,col>是否存在非零元素StatusTSMatrix_Add<TSMatrixM,TSMatrixN,TSMatrix*Q>; //將矩陣M,N相加得到QStatusFastTransposeSMatrix<TSMatrixM,TSMatrix*N>; //快速轉(zhuǎn)置voidmain<>{TSMatrixA,A1,B,C;printf<"矩陣A:\n">;CreateTSMatrix<&A>;PrintTSMatrix<A>;PrintTSMatrix1<A>;printf<"由矩陣A轉(zhuǎn)置得矩陣A1...\n">;FastTransposeSMatrix<A,&A1>;PrintTSMatrix<A1>;PrintTSMatrix1<A1>;printf<"矩陣B:\n">;CreateTSMatrix<&B>;PrintTSMatrix<B>;PrintTSMatrix1<B>;printf<"矩陣A加矩陣B得到矩陣C...\n">;if<TSMatrix_Add<A,B,&C>>{ PrintTSMatrix<C>; PrintTSMatrix1<C>;}}StatusCreateTSMatrix<TSMatrix*M>{intm,n,p=1,num; //data[0]未用,p從1開始;num為非零元個(gè)數(shù)最大值 intk[100][100];srand<<int>time<NULL>>; printf<"PleaseInputTheLinesAndColumnsOfTheMatrix:\n">; printf<"...<矩陣的期望規(guī)格大于4*5<或5*4>>...\n">;printf<"TheLineNumber:">;scanf<"%d",&M->mu>; printf<"TheColumnNumber:">;scanf<"%d",&M->nu>;/* for<m=1;m<=M->mu;m++>for<n=1;n<=M->nu;n++> k[m][n]=0; num=<m*n>/20; printf<"%d",num>; for<p=1;p<=num;p++>{ m=rand<>%M->mu+1; n=rand<>%M->nu+1; if<rand<>%2==1> k[m][n]=rand<>%20+1; elseif<rand<>%2==0> k[m][n]=rand<>%20-20; } for<m=1;m<=M->mu;m++>{for<n=1;n<=M->nu;n++>{ if<k[m][n]!=0>{ M->data[p].e=k[m][n]; M->data[p].i=m; M->data[p].j=n; p++; }}}*/for<m=0;m<M->mu;m++>{for<n=0;n<M->nu;n++>{ k[m][n]=rand<>%20; if<k[m][n]==0>{ if<rand<>%2> M->data[p].e=rand<>%20+1; else M->data[p].e=rand<>%20-20; M->data[p].i=m+1; M->data[p].j=n+1; p++; }}}M->tu=p-1; //p從1開始,剛好等于非零元個(gè)數(shù)-1returnOK;}voidPrintTSMatrix<TSMatrixM>{inti; if<M.tu==0> printf<"無(wú)非零元!\n">; else{ printf<"該矩陣的行數(shù)為%d、列數(shù)為%d、非零元素個(gè)數(shù)為%d.\n非零元的坐標(biāo)及值:\n\n",M.mu,M.nu,M.tu>; printf<"行列元素值\n">; for<i=1;i<=M.tu;i++>{ printf<"%4d%4d%6d\n",M.data[i].i,M.data[i].j,M.data[i].e>; } printf<"\n">; }}voidPrintTSMatrix1<TSMatrixM>{inti,j,k=0;Triple*p=M.data; p++; //data[0]未用,從data[1]開始 printf<"陣列形式為:\n">;for<i=1;i<=M.mu;i++>{for<j=1;j<=M.nu;j++>if<k<M.tu&&p->i==i&&p->j==j>{ printf<"%4d",p->e>;p++;k++;}elseprintf<"%4d",0>;printf<"\n">;} printf<"\n">;}intUnZore<TSMatrixM,introw,intcol>{ intorder=1; //data[0]未用 while<order<=M.tu>{ if<M.data[order].i==row&&M.data[order].j==col> returnorder; order++; } return0;}StatusTSMatrix_Add<TSMatrixM,TSMatrixN,TSMatrix*Q>{ introw,col; intorder=1,order1,order2; //data[0]未用 if<M.mu==N.mu&&M.nu==N.nu>{ for<row=1;row<=M.mu;row++>{ for<col=1;col<=M.nu;col++>{ order1=UnZore<M,row,col>; order2=UnZore<N,row,col>; if<order1&&order2>{ Q->data[order].i=row; Q->data[order].j=col; Q->data[order].e=M.data[order1].e+N.data[order2].e; order++; } elseif<order1&&<!order2>>{ Q->data[order].e=M.data[order1].e; Q->data[orde

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論