稀疏矩阵运算器源代码_第1页
稀疏矩阵运算器源代码_第2页
稀疏矩阵运算器源代码_第3页
稀疏矩阵运算器源代码_第4页
稀疏矩阵运算器源代码_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include "iomanip.h"#include "iostream.h"#include "conio.h"#include "stdio.h"#include "string.h"#include "stdlib.h"#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status ;typedef int ElemType;#define MAXSIZE 100 / 非零元个数的

2、最大值#define SIZENUM 10typedef struct int i,j; / 行下标,列下标ElemType e; / 非零元素值Triple;typedef struct Triple dataMAXSIZE+1; / 非零元三元组表,data0未用 int mu,nu,tu; / 矩阵的行数、列数和非零元个数 TSMatrix;void create(TSMatrix &TM);/创建矩阵void disp(TSMatrix TM);/通常形式输出稀疏矩阵Status LocateELem(TSMatrix M,int i,int j,int e);/三元组表中是否

3、存在非零元素Aij,若存在返回e void InsertSortMatrix(TSMatrix &TM);/根据对矩阵的行列,三元组TM作直接插入排序 Status TransposeSMatrix(TSMatrix M,TSMatrix &T); /矩阵转置的算法Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C); /矩阵的加法运算:C=A+BStatus SubTSM(TSMatrix A,TSMatrix B,TSMatrix &C); /矩阵的减法运算:C=A-BStatus MultSMatrix(TSMa

4、trix A,TSMatrix B,TSMatrix &C); /矩阵的乘法运算:C=A×Bvoid NiMatrix(TSMatrix &TM);/矩阵求逆/-创建矩阵-/void create(TSMatrix &TM) int i,j,i1,j1,n,e;cout<<"矩阵的行数、列数、非零元个数(mu,nu,tu):" cin>>i>>j>>n;TM.mu=i;TM.nu=j;TM.tu=0;if(TM.mu<1|TM.nu<1)cout<<"输入有误

5、!"<<endl;for(int k=1;k<=n;k+)cout<<"第"<<k<<"个元素行、列、值(i,j,e):" cin>>i1>>j1>>e;if(i1>TM.mu|j1>TM.nu|e=0)cout<<"输入有误!"<<endl; k-;else if(LocateELem(TM,i1,j1,e)=1)cout<<"元素已经存在!"<<endl

6、; k-;elseTM.datak.i=i1;TM.datak.j=j1;TM.datak.e=e;TM.tu+; InsertSortMatrix(TM);Status LocateELem(TSMatrix M,int i,int j,int e)/三元组表中是否存在非零元素Aij,若存在返回e int k;for(k=1;k<=M.tu;k+)if(M.datak.i=i&&M.datak.j=j)e=M.datak.e; return TRUE;return FALSE;void InsertSortMatrix(TSMatrix &TM)/根据对矩阵的行

7、列,三元组TM作直接插入排序 int i,j;for(i=2;i<=TM.tu;i+)if(TM.datai.i<TM.datai-1.i|TM.datai.i=TM.datai-1.i&&TM.datai.j<TM.datai-1.j) TM.data0.i=TM.datai.i;TM.data0.j=TM.datai.j;TM.data0.e=TM.datai.e;for(j=i-1;TM.data0.i<TM.dataj.i|TM.data0.i=TM.dataj.i&&TM.data0.j<TM.dataj.j;-j) TM

8、.dataj+1.i=TM.dataj.i;TM.dataj+1.j=TM.dataj.j;TM.dataj+1.e=TM.dataj.e;TM.dataj+1.i=TM.data0.i;TM.dataj+1.j=TM.data0.j;TM.dataj+1.e=TM.data0.e;/-通常形式输出稀疏矩阵-/void disp(TSMatrix TM) int i,j,k,flag=1;for(i=1;i<=TM.mu;i+) cout<<setw(6);for(j=1;j<=TM.nu;j+)for(k=1;k<=TM.tu;k+)if(i=TM.datak.

9、i&&j=TM.datak.j)cout<<TM.datak.e<<setw(6);flag=0;if(flag) cout<<"0"<<setw(6);flag=1;cout<<endl;/-矩阵转置的算法-/Status TransposeSMatrix(TSMatrix M,TSMatrix &T) int col,p,q;T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;if(M.tu)q=1;for(col=1;col<=M.nu;col+)for(p=1;p<

10、;=M.tu;p+) if(M.datap.j=col) T.dataq.i=M.datap.j; T.dataq.j=M.datap.i; T.dataq.e=M.datap.e; +q; return OK; /-矩阵加算法-/ Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C) /* 三元组表示的稀疏矩阵加法: C=A+B */ int n=1,m=1,k=1; ElemType temp; if(A.mu=B.mu&&A.nu=B.nu) while(m<=A.tu&&n<=B.tu) /

11、若A当前元素的行号等于B当前元素的行号,则比较其列号,将较小列的元素 /存入C中,如果列号也相等,则将对应的元素值相加后存入C中 if(A.datam.i=B.datan.i) if(A.datam.j<B.datan.j) C.datak.i=A.datam.i; C.datak.j=A.datam.j; C.datak.e=A.datam.e; k+;m+; else if(A.datam.j>B.datan.j) C.datak.i=B.datan.i; C.datak.j=B.datan.j; C.datak.e=B.datan.e; k+;n+; else temp=A.

12、datam.e+B.datan.e; if(temp!=0)/不为0才添加到C中 C.datak.i=A.datam.i; C.datak.j=A.datam.j; C.datak.e=temp; k+; m+;n+; /若A当前元素的行号小于B当前元素的行号,则将A的元素存入C中 else if(A.datam.i<B.datan.i) C.datak.i=A.datam.i; C.datak.j=A.datam.j; C.datak.e=A.datam.e; k+;m+; /若A当前元素的行号大于B当前元素的行号,则将B的元素存入C中 else C.datak.i=B.datan.i

13、; C.datak.j=B.datan.j; C.datak.e=B.datan.e; k+;n+; /把剩余部分元素存入C中 if(m>A.tu&&n<=B.tu) for( ;n<=B.tu;n+) C.datak.i=B.datan.i; C.datak.j=B.datan.j; C.datak.e=B.datan.e; k+; if(n>B.tu&&m<=A.tu) for( ;m<=A.tu;m+) C.datak.i=A.datam.i; C.datak.j=A.datam.j; C.datak.e=A.datam

14、.e; k+; C.mu=A.mu; C.nu=A.nu; C.tu=k-1; return OK; else return ERROR; /-矩阵的减法运算-/ Status SubTSM(TSMatrix A,TSMatrix B,TSMatrix &C) /* 三元组表示的稀疏矩阵减法: C=A+B */ int n=1,m=1,k=1;ElemType temp;if(A.mu=B.mu&&A.nu=B.nu)while(m<=A.tu&&n<=B.tu)/若A当前元素的行号等于B当前元素的行号,则比较其列号,将较小列的元素 /存入C

15、中,如果列号也相等,则将对应的元素值相减后存入C中 if(A.datam.i=B.datan.i)if(A.datam.j<B.datan.j)C.datak.i=A.datam.i;C.datak.j=A.datam.j;C.datak.e=A.datam.e;k+;m+;else if(A.datam.j>B.datan.j)C.datak.i=B.datan.i;C.datak.j=B.datan.j;C.datak.e=-B.datan.e;k+;n+;else temp=A.datam.e-B.datan.e;if(temp!=0)/不为0才添加到C中C.datak.i=

16、A.datam.i;C.datak.j=A.datam.j;C.datak.e=temp;k+;m+;n+;/若A当前元素的行号小于B当前元素的行号,则将A的元素存入C中 else if(A.datam.i<B.datan.i)C.datak.i=A.datam.i;C.datak.j=A.datam.j;C.datak.e=A.datam.e;k+;m+;/若A当前元素的行号大于B当前元素的行号,则将B的元素存入C中 elseC.datak.i=B.datan.i;C.datak.j=B.datan.j;C.datak.e=-B.datan.e;k+;n+;/把剩余部分元素存入C中if

17、(m<=A.tu)for( ;m<=A.tu;m+)C.datak.i=A.datam.i;C.datak.j=A.datam.j;C.datak.e=A.datam.e;k+;if(n<=B.tu)for( ;n<=B.tu;n+)C.datak.i=B.datan.i;C.datak.j=B.datan.j;C.datak.e=-B.datan.e;k+;C.mu=A.mu;C.nu=A.nu;C.tu=k-1;return OK;else return ERROR;int value(TSMatrix T,int i,int j)/得到Tij的值 int k;fo

18、r(k=1;k<=T.tu;k+)if(T.datak.i=i&&T.datak.j=j)return T.datak.e;return 0;/-矩阵乘法运算的算法-/Status MultSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C) int i,j,k,sum,p=1;for(i=1;i<=A.mu;i+)for(j=1;j<=B.nu;j+) sum=0;for(k=1;k<=A.nu;k+)sum+=value(A,i,k)*value(B,k,j); if(sum!=0) C.datap.i=i;C

19、.datap.j=j;C.datap.e=sum;p+;C.mu=A.mu;C.nu=B.nu;C.tu=p-1;return OK;/JsMatrix()函数用于计算行列式,通过递归算法实现int JsMatrix(int sSIZENUM,int n) int z,j,k,r,total=0;int bSIZENUMSIZENUM;/*bNN用于存放,在矩阵sNN中元素s0的余子式*/if(n>2) for(z=0;z<n;z+)for(j=0;j<n-1;j+)for(k=0;k<n-1;k+)if(k>=z) bjk=sj+1k+1;else bjk=sj

20、+1k;if(z%2=0) r=s0z*JsMatrix(b,n-1); /*递归调用*/else r=(-1)*s0z*JsMatrix(b,n-1);total=total+r;else if(n=2) total=s00*s11-s01*s10;return total;void N1Matrix(int sSIZENUM,float bSIZENUM,int n)/N1Matrix()函数用于求原矩阵各元素对应的余子式,存放在数组bnn中,定义为float型int z,j,k,l,m,g,aSIZENUMSIZENUM;for(z=0;z<n;z+)l=z;for(j=0;j&l

21、t;n;j+) m=j;for(k=0;k<n-1;k+)for(g=0;g<n-1;g+) if(g>=m&&k<l) akg=skg+1;else if(k>=l&&g<m) akg=sk+1g;else if(k>=l&&g>=m) akg=sk+1g+1;else akg=skg;bzj=JsMatrix(a,n-1);/-矩阵求逆-/void NiMatrix(TSMatrix &TM) int i,j,n,k; n=TM.mu;float temp;int aSIZENUMSIZ

22、ENUM;float bSIZENUMSIZENUM,cSIZENUMSIZENUM;for(i=0;i<n;i+)for(j=0;j<n;j+)aij=0;for(i=1;i<=TM.tu;i+)aTM.datai.i-1TM.datai.j-1=TM.datai.e;k=JsMatrix(a,n);cout<<"矩阵的行列式的值: |A|="<<k<<endl;if(k=0) cout<<"行列式的值|A|=0,原矩阵无逆矩阵!"<<endl;else N1Matrix(a

23、, b,n);/调用N1Matrix()函数,得到原矩阵各元素对应的"余子式",存放在数组bnn中for(i=0;i<n;i+) /求代数余子式,此时bnn中存放的为原矩阵各元素对应的"代数余子式"for(j=0;j<n;j+)if(i+j)%2!=0 && bij!=0) bij=-bij;for(i=0;i<n;i+) /对bNN转置,此时bnn中存放的为原矩阵的伴随矩阵 for(j=i+1;j<n;j+)temp=bij;bij=bji;bji=temp;cout<<"伴随矩阵A*:&q

24、uot;<<endl;for(i=0;i<n;i+)/ 打印伴随矩阵A*cout<<setw(6);for(j=0;j<n;j+)cout<<bij<<setw(6);cout<<endl;for(i=0;i<n;i+) /求逆矩阵,此时cnn中存放的是原矩阵的逆矩阵 for(j=0;j<n;j+)cij=bij/k;cout<<"逆矩阵(A*)/|A|:"<<endl;for(i=0;i<n;i+)/ 打印逆矩阵cout<<setw(6);for(

25、j=0;j<n;j+)cout<<cij<<setw(6);cout<<endl;/elsevoid main() system("cls");system("color 17");/设置窗口的背景颜色system("mode con cols=80 lines=40");system("title #矩阵运算器#");printf("t*n"); putchar('n');inp: while(1) /system("cls&

26、quot;);cout<<endl;printf("tt -欢迎使用稀疏矩阵运算器-n",2,2);putchar('n');printf("t*n"); putchar('n');printf("tt <1>矩阵转置 n",2,2);printf("tt - n",2,2); printf("tt <2>矩阵相加 n",2,2);printf("tt - n",2,2);printf("tt &l

27、t;3>矩阵相减 n",2,2);printf("tt - n",2,2);printf("tt <4>矩阵相乘 n",2,2);printf("tt - n",2,2);printf("tt <5>矩阵求逆 n",2,2);printf("tt - n",2,2);printf("tt <6>退出程序 n",2,2);printf("tt - n",2,2);putchar('n');p

28、rintf("t*n");printf("tt 强制退出请按 Ctrl +Cn");printf("t*n");char choice;cout<<endl<<"请选择操作(1-6):"cin>>choice;TSMatrix A,B,C;switch(choice) case '1':cout<<"创建矩阵A"<<endl;create(A);TransposeSMatrix(A,B);cout<<&quo

29、t;矩阵A:"<<endl;disp(A);cout<<"转置矩阵A:"<<endl;disp(B);cout<<" Press any key to continue!"<<endl<<endl;getche();system("cls");goto inp;case '2':cout<<"创建矩阵A"<<endl;create(A);cout<<"创建矩阵B"

30、<<endl;create(B);if(A.mu!=B.mu|A.nu!=B.nu) cout<<"两个矩阵的行、列数不匹配运算规则"<<endl;cout<<" Press any key to continue!"<<endl<<endl;getche();system("cls");goto inp;AddTSM(A,B,C);cout<<"矩阵A:"<<endl;disp(A); cout<<&quo

31、t;矩阵B:"<<endl;disp(B); cout<<"矩阵C=A+B:"<<endl;disp(C); cout<<" Press any key to continue!"<<endl<<endl; getche();system("cls"); goto inp; case '3': cout<<"创建矩阵A"<<endl; create(A); cout<<"创

32、建矩阵B"<<endl; create(B); if(A.mu!=B.mu|A.nu!=B.nu) cout<<"两个矩阵的行、列数不匹配运算规则"<<endl; cout<<" Press any key to continue!"<<endl<<endl; getche();system("cls"); goto inp; SubTSM(A,B,C); cout<<"矩阵A:"<<endl;disp(A);

33、 cout<<"矩阵B:"<<endl;disp(B); cout<<"矩阵C=A-B:"<<endl;disp(C); cout<<" Press any key to continue!"<<endl<<endl; getche();system("cls"); goto inp; case '4': cout<<"创建矩阵A"<<endl; create(A); cout<<"创建矩阵B"<<endl; create(B); if(A.mu!=B.nu) cout<<"两个矩阵的行、列数不匹配运算规则"<<endl; cout<<" Press any key to continue!"<<endl<<endl; getche();system("cls"); goto inp; MultSMatrix(A,B,C); cout<<"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论