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

下载本文档

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

文档简介

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 0 typedef int Status ; typedef int ElemType; #define MAXSIZE 100 / 非零元个数的最大值 #define SIZENUM 10 typedef struct int i,j; / 行下标,列下标 Ele

2、mType 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); /三元组表中是否存在非零元素Aij,若存在返回e void InsertSortMatrix(TSMatrix &TM);

3、 /根据对矩阵的行列,三元组TM作直接插入排序 Status TransposeSMatrix(TSMatrix M,TSMatrix &T); /矩阵转置的算法 Status AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C); /矩阵的加法运算:C=A+B Status SubTSM(TSMatrix A,TSMatrix B,TSMatrix &C); /矩阵的减法运算:C=A-B Status MultSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C); /矩阵的乘法运算:C=AB void NiMatrix(TSMat

4、rix &TM); /矩阵求逆 /-创建矩阵-/ void create(TSMatrix &TM) int i,j,i1,j1,n,e; coutijn; TM.mu=i;TM.nu=j;TM.tu=0; if(TM.mu1|TM.nu1) cout输入有误!endl; for(int k=1;k=n;k+) cout第ki1j1e; if(i1TM.mu|j1TM.nu|e=0) cout输入有误!endl; k-; else if(LocateELem(TM,i1,j1,e)=1) cout元素已经存在!endl; k-; else TM.datak.i=i1;TM.datak.j=j1

5、;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) /根据对矩阵的行列,三元组TM作直接插入排序 int i,j; for(i=2;i=TM.tu;i+) i

6、f(TM.datai.iTM.datai-1.i|TM.datai.i=TM.datai-1.i&TM.datai.jTM.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.iTM.dataj.i|TM.data0.i=TM.dataj.i&TM.data0.jTM.dataj.j;-j) TM.dataj+1.i=TM.dataj.i; TM.dataj+1.j=TM.dataj.j; TM.dataj+1.e=TM.dataj.e; TM.da

7、taj+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+) coutsetw(6); for(j=1;j=TM.nu;j+) for(k=1;k=TM.tu;k+) if(i=TM.datak.i&j=TM.datak.j) coutTM.datak.esetw(6);flag=0; if(flag) cout0setw(6); flag=1; coutendl;

8、/-矩阵转置的算法-/ 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=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,TSMatri

9、x 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中,如果列号也相等,则将对应的元素值相加后存入C中 if(A.datam.i=B.datan.i) if(A.datam.jB.datan.j) C.datak.i=B.datan.i; C.datak.j=B.datan.j; C.datak.e=B.datan.e; k+;n

10、+; else temp=A.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.iA.tu&n=B.tu) for( ;nB.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.e; k+; C.mu=A.mu

11、; 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中,如果列号也相等,则将对应的元素值相减后存入C中 if(A.datam.i=B.da

12、tan.i) if(A.datam.jB.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=A.datam.i; C.datak.j=A.datam.j; C.datak.e=temp; k+; m+;n+; /若A当前元素的行号小于B当前元素的行号,则将A的元素存入C中 else if(A.datam.iB.datan.i) C.datak.i=A.datam

13、.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; C.datak.j=B.datan.j; C.datak.e=-B.datan.e; k+;n+; /把剩余部分元素存入C中 if(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.d

14、atak.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; for(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,TSMa

15、trix 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;k2) for(z=0;zn;z+) for(j=0;jn-1;j+) for(k=0;k=z) bjk=sj+1k+1; else bjk=sj+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; retu

16、rn total; void N1Matrix(int sSIZENUM,float bSIZENUM,int n) /N1Matrix()函数用于求原矩阵各元素对应的余子式,存放在数组bnn中,定义为float型 int z,j,k,l,m,g,aSIZENUMSIZENUM; for(z=0;zn;z+) l=z; for(j=0;jn;j+) m=j; for(k=0;kn-1;k+) for(g=0;g=m&k=l&g=l&g=m) akg=sk+1g+1; else akg=skg; bzj=JsMatrix(a,n-1); /-矩阵求逆-/ void NiMatrix(TSMatr

17、ix &TM) int i,j,n,k; n=TM.mu; float temp; int aSIZENUMSIZENUM; float bSIZENUMSIZENUM,cSIZENUMSIZENUM; for(i=0;in;i+) for(j=0;jn;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|=kendl; if(k=0) cout行列式的值|A|=0,原矩阵无逆矩阵!endl; else N1Matrix(a, b,n); /

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

19、jsetw(6); coutendl; for(i=0;in;i+) /求逆矩阵,此时cnn中存放的是原矩阵的逆矩阵 for(j=0;jn;j+) cij=bij/k; cout逆矩阵(A*)/|A|:endl; for(i=0;in;i+)/ 打印逆矩阵 coutsetw(6); for(j=0;jn;j+) coutcijsetw(6); coutendl; /else void main() system(cls); system(color 17);/设置窗口的背景颜色 system(mode con cols=80 lines=40); system(title #矩阵运算器#);

20、printf(t*n); putchar(n); inp: while(1) /system(cls); coutendl; printf(tt -欢迎使用稀疏矩阵运算器-n,2,2); putchar(n); printf(t*n); putchar(n); printf(tt 矩阵转置 n,2,2); printf(tt - n,2,2); printf(tt 矩阵相加 n,2,2); printf(tt - n,2,2); printf(tt 矩阵相减 n,2,2); printf(tt - n,2,2); printf(tt 矩阵相乘 n,2,2); printf(tt - n,2,2

21、); printf(tt 矩阵求逆 n,2,2); printf(tt - n,2,2); printf(tt 退出程序 n,2,2); printf(tt - n,2,2); putchar(n); printf(t*n); printf(tt 强制退出请按 Ctrl +Cn); printf(t*n); char choice; coutendlchoice; TSMatrix A,B,C; switch(choice) case 1: cout创建矩阵Aendl; create(A); TransposeSMatrix(A,B); cout矩阵A:endl;disp(A); cout转置

22、矩阵A:endl;disp(B); cout Press any key to continue!endlendl; getche();system(cls); goto inp; case 2: cout创建矩阵Aendl; create(A); cout创建矩阵Bendl; create(B); if(A.mu!=B.mu|A.nu!=B.nu) cout两个矩阵的行、列数不匹配运算规则endl; cout Press any key to continue!endlendl; getche();system(cls); goto inp; AddTSM(A,B,C); cout矩阵A:e

23、ndl;disp(A); cout矩阵B:endl;disp(B); cout矩阵C=A+B:endl;disp(C); cout Press any key to continue!endlendl; getche();system(cls); goto inp; case 3: cout创建矩阵Aendl; create(A); cout创建矩阵Bendl; create(B); if(A.mu!=B.mu|A.nu!=B.nu) cout两个矩阵的行、列数不匹配运算规则endl; cout Press any key to continue!endlendl; getche();system(cls); goto inp; SubTSM(A,B,C); cout矩阵A:endl;disp(A); cout矩阵B:endl;disp(B); cout矩阵C=A-B:endl;disp(C); cout Press any key to continue!endlendl; getche();system(cls); goto inp; case 4: c

温馨提示

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

最新文档

评论

0/150

提交评论