三元组实现稀疏矩阵加减乘.doc

上传人:scccc 文档编号:14979421 上传时间:2022-02-28 格式:DOC 页数:22 大小:100.50KB
返回 下载 相关 举报
三元组实现稀疏矩阵加减乘.doc_第1页
第1页 / 共22页
三元组实现稀疏矩阵加减乘.doc_第2页
第2页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《三元组实现稀疏矩阵加减乘.doc》由会员分享,可在线阅读,更多相关《三元组实现稀疏矩阵加减乘.doc(22页珍藏版)》请在三一文库上搜索。

1、 #define MAXSIZE 12500 / 三元组结构 typedef struct int e; / Triple; / 矩阵结构 typedef struct Triple dataMAXSIZE+1; int rposMAXSIZE+1; / 这是存放各行第一非零元在矩阵中的位置 int mu,nu,tu; / 矩阵的行数、列数、非零元个数 Matrix; void Init(Matrix* M); void Add(Matrix* M,Matrix* T,Matrix* G); void Jian(Matrix* M,Matrix* T,Matrix* G);int i,j; /

2、 矩阵行下标和列下标 printf( 第4 个非零元的列号:,i); void Cheng(Matrix* M,Matrix* T,Matrix* G); void Cheng(Matrix* M,Matrix* T,Matrix* G); void PrintMatrix(Matrix* M); /2 、初始化矩阵 void Init(Matrix* M) int i; if(M-mu nu tu M-mu*M-nu) printf( 出错 !n); / 如果矩阵的行数、列数不符合要求,打印出错 for(i=1;itu;i+) /data0 不用 prin tf( 第4 个非零元的行号:,i

3、); / 以下为数据初始化 scanf(%d,&M-datai.i); scanf(%d,&M-datai.j); printf(” 第4 个非零元的元素值:,i); scanf(%d,&M-datai.e); printf(n); printf( 您创建的矩阵如下 :n); PrintMatrix(M); /3 、矩阵相加 void Add(Matrix* M,Matrix* T,Matrix* G) G-mu = M-mu; / 初始化第三方矩阵的行、列数。 因为加减运算必须维数相等,所以 M、T 行、 列数相等, printf( 第4 个非零元的列号:,i); G-nu = M-nu;

4、G-tu = 0; int g,m,t; /g 、m、t 分别记录三个矩阵的元素的存储位置 g = m = t = 1; / 从 data1 开始 int k; int sum; / 和 if(M-mu != T-mu | M-nu != T-nu) printf( 维数不等 !n); for(k = 1;k mu;k+) / 行下标和下标相等的对应元素相加 开始 if(M-datam.i = k & T-datat.i = k) / if(M-datam.j = T-datat.j ) / sum=M-datam.e+T-datat.e; / 行下标相等时 列下标相等时 矩阵向加 if(su

5、m != 0) / 相加不为零时 G-datag.i=k; G-datag.j=M-datam.j; G-datag.e=sum; G-tu+; g+; m+; t+; else / 矩阵相加为零时,不做存储操作 m+; t+; * */ / 行下标和下标不等的元素直接插入到 G 的相应位置 while(M-datam.i = k) / G-datag.i = k; G-datag.j = M-datam.j; G-datag.e = M-datam.e; G-tu+; m+; g+; while(T-datat.i = k) / G-datag.i = k; G-datag.j = T-da

6、tat.j;开始 插入 M 剩余的元素 插入 T 剩余的元素 G-datag.e = T-datat.e; G-tu+; t+; g+; /G-tu=g; / 记录运算完成后, 第三方矩阵非零元的个数 /* 结束 */ printf(n); printf( 相加后的矩阵如下 :n); PrintMatrix(G); /4 、矩阵相减 void Jian(Matrix* M,Matrix* T,Matrix* G) G-mu = M-mu; G-nu = M-nu; G-tu = 0; int sum,k; int m,t,g; m = t = g = 1; if(M-mu != T-mu |

7、M-nu != T-nu) printf( 维数不等 !n); for(k = 1;k mu;k+) / 行下标和下标相等的对应元素相减 if(M-datam.i = k & T-datat.i = k) / if(M-datam.j = T-datat.j ) /开始 行下标相等时 列下标相等时 sum=M-datam.e-T-datat.e; / 矩阵向减 if(sum != 0) / 相加不为零时 G-datag.i=k; G-datag.j=M-datam.j; G-datag.e=sum; G-tu+; g+; m+; t+; else m+; t+; / 行下标和下标不等的元素直接

8、插入到 G 的相应位置 while(M-datam.i = k) / G-datag.i = k; G-datag.j = M-datam.j; G-datag.e = M-datam.e; G-tu+; m+; g+; while(T-datat.i = k) /结束 开始 插入 M 剩余的元素 插入 T 的元素 G-datag.i = k; G-datag.j = T-datat.j; G-datag.e = 0 - T-datat.e; G-tu+; t+; g+; /G-tu=g; / /* printf(n); printf( 相减后的矩阵如下 :n); PrintMatrix(G)

9、; /5 、矩阵相乘 void Cheng(Matrix* M,Matrix* T,Matrix* G) int k,w,q,x,mrow,trow,gcol; 记录运算完成后,第三方矩阵非零元的个数 结束 */ int tmpMAXSIZE; / 累加器 int numMAXSIZE; / 记录矩阵的各行的第一个非零元的位置 int m,t,g; m = t = g w =1; if(M-nu != T-mu) / 如果第一个矩阵的列数不等于第二个矩阵的行 printf( 这两个矩阵不能相乘 !n); / 初始化 G-mu = M-mu; G-nu = T-nu; G-tu = 0; if(

10、M-tu * T-tu != 0) / / 记录各个矩阵的各行的第一个非零元的位置 / /* */ / 记录矩阵 M 中各行非零元的个数 for(mrow = 1; mrow mu; mrow+) / 清零 nummrow = 0; for(w = 1;w tu;w+) k = M-dataw.i; numk+;开始 for(trow = 1; trow mu; trow+) / 清零 第一行第一个非零元的位置在 data 的第一位 for(mrow = 2; mrow mu; mrow+) / 第 N 行第一个非零元的位置 M-rposmrow = M-rposmrow-1 + nummro

11、w-1; printf(n); printf( 矩阵 Mn); for(mrow = 1;mrow mu; mrow+) printf( 第 %d 行 的 第 一 个 非 零 元 在 data 中 的 序 号 是:(d),mrow,M-rposmrow); printf(n); / 记录矩阵 T 中各行非零元的个数 numtrow = 0;M-rpos1 = 1; / for(trow = 1;trow mu; trow+) for(w = 1;w tu;w+) k = T-dataw.i; numk+; T-rpos1 = 1; / 第一行第一个非零元的位置在 data 的第一位 for(t

12、row = 2; trow mu; trow+) / 第 N 行第一个非零元的位置 T-rpostrow = T-rpostrow-1 + numtrow-1; printf(n); printf(n); printf( 矩阵 Tn);printf( 是:(d),trow,T-rpostrow); printf(n); I* for(mrow = 1; mrow mu; mrow+) for(k = 1; k nu;k+) / 当前行各元素累加器清零 tmpk = 0; G-rposmrow = G-tu + 1; / 矩阵 G 的各行的第一个非零元在 G-data 中的位置 for(w =

13、M-rposmrow;w rposmrow+1;w+) trow = M-dataw.j; / 找到对应 T 的行号 if(trow mu)结束 for(gcol = 1; gcol nu;gcol+) / 压缩存储 x = T-rpostrow+1; else x = T-tu+1; for(q = T-rpostrow; qdataq.j; tmpgcol += M-dataw.e * T-dataq.e; / 对应非零元累加 if(tmpgcol) G-dataG-tu+1.i = mrow; G-dataG-tu+1.j = gcol; G-dataG-tu+1.e = tmpgcol

14、; G-tu+; printf(n); printf( 相乘后的矩阵如下 :n); PrintMatrix(G); /6 、矩阵打印 void PrintMatrix(Matrix* M)printf( 请输入第一个矩阵的行数和列数: ); int k; printf( 非零元素数 %dn,M-tu); for(k = 1;k tu;k+) printf(%d,%d,%d)n,M-datak.i,M-datak.j,M-datak.e); /7 、主函数 int main(int argc, char* argv) Matrix* M =(Matrix*)malloc(sizeof(Matri

15、x); Matrix* T =(Matrix*)malloc(sizeof(Matrix); Matrix* G =(Matrix*)malloc(sizeof(Matrix); int tag = 1; int n; scanf(%d %d,&(M-mu),&(M-nu); printf( 非零元的个数: ); scanf(%d,&(M-tu); Init(M); printf(n); printf( 请输入第二个矩阵的行数和列数: ); scanf(%d %d,&(T-mu),&(T-nu); printf( 非零元的个数: ); scanf(%d,&(T-tu); Init(T); while(tag) printf( 请选择操作 ! 1 、相加 2 、相减 3 、相乘 4 、退出 ); printf(n); scanf(%d,&n); switch(n) case 1: Add(M,T,G); break; case 2: Jian(M,T,G); break; case 3: Cheng(M,T,G); break; case 4: tag=0; return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1