數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告n維矩陣乘法_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告n維矩陣乘法_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告n維矩陣乘法_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告n維矩陣乘法_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告n維矩陣乘法_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1/1數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告n維矩陣乘法數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目:n維矩陣乘法:AB-1專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)班級(jí)計(jì)本學(xué)生學(xué)號(hào)指導(dǎo)教師起止時(shí)間20XX.X.3-20XX.X.11學(xué)年第I學(xué)期一、具體任務(wù)功能:設(shè)計(jì)一個(gè)矩陣相乘的程序,首先從鍵盤輸入兩個(gè)矩陣a,b的內(nèi)容,并輸出兩個(gè)矩陣,輸出ab-1結(jié)果。分步實(shí)施:1.初步完成總體設(shè)計(jì),搭好框架,確定人機(jī)對(duì)話的界面,確定函數(shù)個(gè)數(shù);2.完成最低要求:建立一個(gè)文件,可完成2維矩陣的情況;3.進(jìn)一步要求:通過(guò)鍵盤輸入維數(shù)n。有興趣的同學(xué)可以自己擴(kuò)充系統(tǒng)功能。要求:1.界面友好,函數(shù)功能要?jiǎng)澐趾?.總體設(shè)計(jì)應(yīng)畫一流程圖3.程序要加必要的注釋4.要提供程序測(cè)試方案5.程序一定要經(jīng)得起測(cè)試,寧可功能少一些,也要能運(yùn)行起來(lái),不能運(yùn)行的程序是沒(méi)有價(jià)值的。二、軟件環(huán)境MicrosoftVisualC++6.0三、問(wèn)題的需求分析程序以二維數(shù)組作為矩陣的存儲(chǔ)結(jié)構(gòu),通過(guò)鍵盤輸入矩陣維數(shù)n,動(dòng)態(tài)分配內(nèi)存空間,創(chuàng)建n維矩陣。矩陣建立后再通過(guò)鍵盤輸入矩陣的各個(gè)元素值;也可以通過(guò)文件讀入矩陣的各項(xiàng)數(shù)據(jù)(維數(shù)及各元素值)。當(dāng)要對(duì)矩陣作進(jìn)一步操作(AxB或AxB^(-1))時(shí),先判斷內(nèi)存中是否已經(jīng)有相關(guān)的數(shù)據(jù)存在,若還未有數(shù)據(jù)存在則提示用戶先輸入相關(guān)數(shù)據(jù)。當(dāng)要對(duì)矩陣進(jìn)行求逆時(shí),先利用矩陣可逆的充要條件:|A|!=0判斷矩陣是否可逆,若矩陣的行列式|A|==0則提示該矩陣為不可逆的;若|A|!=0則求其逆矩陣,并在終端顯示其逆矩陣。四、算法設(shè)計(jì)思想及流程圖1.抽象數(shù)據(jù)類型ADTMatrixMulti{數(shù)據(jù)對(duì)象:D={a(I,j)|i=1,2,3,…,n;j=1,2,…,n;a(i,j)∈ElemSet,n為矩陣維數(shù)}數(shù)據(jù)關(guān)系:R={Row,Col}Row={a(i,j),a(i,j+1)|1=i=n,1=j=n-1}Col={a(i,j),a(i+1,j)|1=i=n-1,1=j=n}基本操作:Swap(a,b);初始條件:記錄a,b已存在。操作結(jié)果:交換記錄a,b的值。CreateMatrix(n);操作結(jié)果:創(chuàng)建n維矩陣,返回該矩陣。Input(M);初始條件:矩陣M已存在。操作結(jié)果:從終端讀入矩陣M的各個(gè)元素值。Print(M)初始條件:矩陣M已存在。操作結(jié)果:在終端顯示矩陣M的各個(gè)元素值。ReadFromFile();操作結(jié)果:從文件讀入矩陣的相關(guān)數(shù)據(jù)。Menu_Select();操作結(jié)果:返回菜單選項(xiàng)。MultMatrix(M1,M2,R);初始條件:矩陣M1,M2,R已存在。操作結(jié)果:矩陣M1,M2作乘法運(yùn)算,結(jié)果放在R中。DinV(M,V);初始條件:矩陣M,V已存在。操作結(jié)果:求矩陣M的逆矩陣,結(jié)果放入矩陣V中。MatrixDeterm(M,n);初始條件:矩陣M已存在。操作結(jié)果:求矩陣M的行列式的值。}ADTMatrixMulti2.矩陣求逆算法設(shè)計(jì)思想算法采用高斯-約旦法(全選主元)求逆,主要思想如下:首先,對(duì)于k從0到n-1作如下幾步:①?gòu)牡趉行、第k列開(kāi)始的右下角子陣中選取絕對(duì)值最大的元素,并記住此元素所在的行號(hào)與列號(hào),再通過(guò)行交換和列交換將它交換到主元素位置上。這一步稱為全選主元。②主元求倒:M(k,k)=1/M(k,k)③M(k,j)=M(k,j)xM(k,k);j=0,1,…,n-1;j!=k④M(i,j)=M(i,j)–M(i,k)xM(k,j);i,j=0,1,…,n-1;i,j!=k⑤M(i,k)=-M(i,k)xM(k,k),i=0,1…,n-1;i!=k最后,根據(jù)在全選主元過(guò)程中所記錄的行、列交換的信息進(jìn)行恢復(fù),恢復(fù)原則如下:在全選主元過(guò)程中,先交換的行(列)后進(jìn)行恢復(fù);原來(lái)的行(列)交換用列(行)交換來(lái)恢復(fù)。3.矩陣行列式求值運(yùn)算算法設(shè)計(jì)思想利用行列式的性質(zhì):行列式等于它的任一行(列)各元素與其對(duì)應(yīng)的代數(shù)余子式乘積,即D=∑a(i,k)xA(i,k);k=1,2,…,n;D=∑a(k,j)xA(k,j);k=1,2,…,n;再利用函數(shù)的遞歸調(diào)用法實(shí)現(xiàn)求其值。4.各函數(shù)間的調(diào)用關(guān)系Main()ReadFromFile()DinV()Swap()Print()Menu_Select()MatrixDeterm()CreateMatrix()MultMatrix()Input()5.流程圖否否是否是是否是否否是開(kāi)始switch(Menu_Select())case1:case3:case2:n0?是輸入矩陣維數(shù)n輸入矩陣A,B輸出矩陣維數(shù)nsystem(“pause”);通過(guò)鍵盤輸入需對(duì)哪個(gè)矩陣求逆,求出相應(yīng)該的逆陣,并顯示求得的逆陣system(“pause”);若矩陣不可逆則返回主菜單case4:R=AxB并顯示矩陣Rsystem(“pause”);case5:是否是R=AxB^(-1)顯示矩陣Rsystem(“pause”);若B不可逆,則返回主菜單case6:從指定文件中讀入矩陣數(shù)據(jù)case0:exit(0);結(jié)果否五、源代碼#includeconio.h#includestdio.h#includestdlib.h#includemath.h#includemalloc.h#includestring.h#defineYES1#defineNO0typedeffloatElemType;ElemTypexxA;//矩陣AElemTypexxB;//矩陣BElemTypexxR;//矩陣R,用于存放運(yùn)算結(jié)果ElemTypexxV;//矩陣V,存放逆矩陣intn=0;//矩陣維數(shù)intflag=-1;//標(biāo)記voidswap(ElemTypexa,ElemTypexb)//交換記錄a,b的值{ElemTypec;c=xa;xa=xb;xb=c;}ElemTypexxCreateMatrix(intn)//創(chuàng)建n維矩陣,返回該矩陣{inti,j;ElemTypexxM;M=(ElemTypexx)malloc(sizeof(ElemTypex)xn);if(M==NULL)exit(1);for(i=0;in;i++){x(M+i)=(ElemTypex)malloc(sizeof(ElemType)xn);for(j=0;jn;j++)x(x(M+i)+j)=0;}returnM;}ElemTypeMatrixDeterm(ElemTypexxM,intn)/x遞歸法求n維矩陣行列式的值,返回運(yùn)算結(jié)果x/{inti,j,k,l,s;ElemTypexxT1;ElemTypexxT2;T1=CreateMatrix(n);T2=CreateMatrix(n);ElemTypeu;ElemTypevalue=0;//運(yùn)算結(jié)果for(i=0;in;i++){for(j=0;jn;j++){T1[i][j]=M[i][j];T2[i][j]=M[i][j];}}if(n==2)//若為2維矩陣,則直接運(yùn)算并返回運(yùn)算結(jié)果{value=T2[0][0]xT2[1][1]-T2[0][1]xT2[1][0];returnvalue;}else{for(j=0;jn;j++)//將矩陣的行列式以第一行展開(kāi){u=T1[0][j];for(i=1,l=0;in;i++)//求矩陣行列式的余子式M(0,j){for(k=0,s=0;kn;k++){if(k==j)continue;else{T2[l][s]=T1[i][k];s++;}}l++;}value=value+ux((int)pow(-1,j))xMatrixDeterm(T2,n-1);/x行列式等于某一行的各個(gè)元素與其代數(shù)余子式的乘積之和x/}returnvalue;}}intDinV(ElemTypexxM,ElemTypexxV)/x全選主元法求矩陣M的逆矩陣,結(jié)果存入矩陣V中x/{inti,j,k;ElemTyped;ElemTypeu;intxJS,xIS;JS=(intx)malloc(sizeof(int)xn);IS=(intx)malloc(sizeof(int)xn);u=MatrixDeterm(M,n);//返回矩陣A的行列式值if(u==0)return-1;for(i=0;in;i++)for(j=0;jn;j++)V[i][j]=M[i][j];for(k=0;kn;k++){d=0;for(i=k;in;i++)//找出矩陣M從M[k][k]開(kāi)始絕對(duì)值最大的元素{for(j=k;jn;j++){if(fabs(V[i][j])d){d=fabs(V[i][j]);//d記錄絕對(duì)值最大的元素的值/x把絕對(duì)值最大的元素在數(shù)組中的行、列坐標(biāo)分別存入IS[K],JS[K]x/IS[k]=i;JS[k]=j;}}}if(d+1.0==1.0)return0;//所有元素都為0if(IS[k]!=k)/x若絕對(duì)值最大的元素不在第k行,則將矩陣IS[K]行的元素與k行的元素相交換x/for(j=0;jn;j++)swap(V[k][j],V[IS[k]][j]);if(JS[k]!=k)/x若絕對(duì)值最大的元素不在第k列,則將矩陣JS[K]列的元素與k列的元素相交換x/for(i=0;in;i++)swap(V[i][k],V[i][JS[k]]);V[k][k]=1/V[k][k];//絕對(duì)值最大的元素求倒for(j=0;jn;j++)/x矩陣M第k行除元素M[k][k]本身外都乘以M[k][k]x/if(j!=k)V[k][j]=V[k][j]xV[k][k];for(i=0;in;i++)/x矩陣除第k行的所有元素與第k列的所有元素外,都拿本身減去M[i][k]xM[k][j],其中i,j為元素本身在矩陣的位置坐標(biāo)x/if(i!=k)for(j=0;jn;j++)if(j!=k)V[i][j]=V[i][j]-V[i][k]xV[k][j];for(i=0;in;i++)/x矩陣M第k列除元素M[k][k]本身外都乘以-M[k][k]x/if(i!=k)V[i][k]=-V[i][k]xV[k][k];}for(k=n-1;k=0;k--)/x根據(jù)上面記錄的行IS[k],列JS[k]信息恢復(fù)元素x/{for(j=0;jn;j++)if(JS[k]!=k)swap(V[k][j],V[JS[k]][j]);for(i=0;in;i++)if(IS[k]!=k)swap(V[i][k],V[i][IS[k]]);}free(IS);free(JS);return0;}voidMultMatrix(ElemTypexxM1,ElemTypexxM2,ElemTypexxR)/x矩陣M1乘M2結(jié)果存入矩陣Rx/{inti,j,k;for(i=0;in;i++){for(j=0;jn;j++){R[i][j]=0;}}for(i=0;in;i++){for(j=0;jn;j++){for(k=0;kn;k++){R[i][j]=R[i][j]+M1[i][k]xM2[k][j];}}}}voidInput(ElemTypexxM)//輸入矩陣M的各個(gè)元素值{inti,j;charstr[10];charc='A';if(flag==1)c='B';system(“cls“);printf(“\n\n輸入矩陣%c(%dx%d)\n“,c,n,n);for(i=0;in;i++){for(j=0;jn;j++){scanf(“%f“,x(M+i)+j);}}flag=1;gets(str);//吸收多余的字符}voidPrint(ElemTypexxM)//顯示矩陣M的各個(gè)元素值{inti,j;printf(“\t“);for(i=0;in;i++){for(j=0;jn;j++){printf(“%.3f“,M[i][j]);}puts(““);printf(“\t\t“);}}intMenu_Select(){charc;do{system(“cls“);puts(“\t\txxxxxxxxxxxxxn維矩陣乘法器xxxxxxxxxxxxx“);puts(“\t\t|1.通過(guò)鍵盤輸入各項(xiàng)數(shù)據(jù)|“);puts(“\t\t|2.顯示矩陣A,B|“);puts(“\t\t|3.矩陣求逆,并顯示逆矩陣|“);puts(“\t\t|4.求矩陣運(yùn)算AxB,并顯示運(yùn)算結(jié)果|“);puts(“\t\t|5.求矩陣運(yùn)算AxB^(-1),并顯示運(yùn)算結(jié)果|“);puts(“\t\t|6.從文件讀入矩陣A,B與維數(shù)n|“);puts(“\t\t|0.退出|“);puts(“\t\txxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx“);printf(“\t\t請(qǐng)選擇(0-6):“);c=getchar();}while(c'0'||c'6');return(c-'0');}voidReadFromFile()//從指定文件讀入矩陣的維數(shù)及矩陣各元素的值{inti,j;FILExfp;if((fp=fopen(“tx.txt“,“r“))==NULL){puts(“無(wú)法打開(kāi)文件!!!“);system(“pause“);exit(0);}fscanf(fp,“%d“,n);//讀入矩陣維數(shù)A=CreateMatrix(n);//創(chuàng)建矩陣ABVRB=CreateMatrix(n);V=CreateMatrix(n);R=CreateMatrix(n);for(i=0;in;i++)//讀入矩陣A{for(j=0;jn;j++){fscanf(fp,“%f“,A[i][j]);}}for(i=0;in;i++)//讀入矩陣A{for(j=0;jn;j++){fscanf(fp,“%f“,B[i][j]);}}puts(“\n\n讀文件成功“);fclose(fp);flag=1;}intmain(){inti;charc,h;charstr[10];for(;;){switch(Menu_Select()){case1:flag=-1;for(;;){system(“cls“);printf(“\n\n\t矩陣維數(shù)n:“);scanf(“%d“,n);gets(str);if(n0)break;else{printf(“\n\t輸入有誤,請(qǐng)重新輸入!\n“);puts(““);system(“pause“);}}A=CreateMatrix(n);B=CreateMatrix(n);V=CreateMatrix(n);R=CreateMatrix(n);Input(A);Input(B);break;case2:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩陣數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)“);system(“pause“);break;}puts(“\n“);printf(“\tA=“);Print(A);puts(“\n“);printf(“\tB=“);Print(B);puts(““);system(“pause“);break;case3:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩陣數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)“);system(“pause“);break;}for(;;){printf(“\n\n\t輸入需要求逆的矩陣(A/B):“);h=getchar();c=getchar();//h=getchar();if(c=='A'||c=='a'){i=DinV(A,V);if(i==-1){puts(“\n\n\t矩陣A的行列式等于0,不可逆!“);system(“pause“);break;}printf(“\tA=“);Print(A);puts(“\n“);printf(“A^(-1)=“);Print(V);puts(““);system(“pause“);break;}elseif(c=='B'||c=='b'){i=DinV(B,V);if(i==-1){puts(“\n\n\t矩陣B的行列式等于0,不可逆!“);system(“pause“);break;}printf(“\tB=“);Print(B);puts(“\n“);printf(“B^(-1)=“);Print(V);puts(““);system(“pause“);break;}elseputs(“\n\n\t輸入有誤,請(qǐng)重新輸入!\n“);}break;case4:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩陣數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)“);system(“pause“);break;}MultMatrix(A,B,R);printf(“\n\n\tAxB=“);Print(R);puts(““);system(“pause“);break;case5:system(“cls“);if(flag==-1){puts(“\n\n\t不存在任何矩陣數(shù)據(jù),請(qǐng)先輸入數(shù)據(jù)“);system(“pause“);break;}i=DinV(B,V);if(i==-1){puts(“\n\n\t矩陣B的行列式等于0,不可逆!“);system(“pause“

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論