稀疏矩阵相加
来源:互联网 发布:网络短信免费版手机版 编辑:程序博客网 时间:2024/05/28 09:32
问题及代码:
/* * Copyright (c) 2015, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称: main.cpp * 作者:高哲 * 完成日期:2015年12月13日 * 版本号:codeblocks * 问题描述: 采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法 * 输入描述: 无* 程序输出: 见运行结果 */ #ifndef TUP_H_INCLUDED #define TUP_H_INCLUDED #include<stdio.h> #define M 6 #define N 7 #define MaxSize 100 typedef int ElemType; typedef struct { int r; int c; ElemType d; }TupNode; typedef struct { int rows; int cols; int nums; TupNode data[MaxSize]; }TSMatrix; void CreatMat(TSMatrix &t,ElemType A[M][N]); //从一个二维稀疏矩阵创建其三元组表示 bool Value(TSMatrix &t,ElemType x,int i,int j); //三元组元素赋值 bool Assign(TSMatrix t,ElemType &x,int i,int j); //将指定位置的元素值赋给变量 void DispMat(TSMatrix t);//输出三元组 bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c); #endif // TUP_H_INCLUDED /** Copyright (c) 2015, 烟台大学计算机与控制工程学院* All rights reserved.* 文件名称: main.cpp,tup.cpp,tup.h* 作者:巩凯强* 完成日期:2015年11月1日* 版本号:codeblocks** 问题描述: 采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法* 输入描述: 无* 程序输出: 见运行结果*/#ifndef TUP_H_INCLUDED#define TUP_H_INCLUDED#include<stdio.h>#define M 6#define N 7#define MaxSize 100typedef int ElemType;typedef struct{ int r; int c; ElemType d;}TupNode;typedef struct{ int rows; int cols; int nums; TupNode data[MaxSize];}TSMatrix;void CreatMat(TSMatrix &t,ElemType A[M][N]); //从一个二维稀疏矩阵创建其三元组表示bool Value(TSMatrix &t,ElemType x,int i,int j); //三元组元素赋值bool Assign(TSMatrix t,ElemType &x,int i,int j); //将指定位置的元素值赋给变量void DispMat(TSMatrix t);//输出三元组bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c);#endif // TUP_H_INCLUDED[csharp] view plaincopyprint?#include"tup.h" void CreatMat(TSMatrix &t,ElemType A[M][N]) { int i,j; t.rows=M; t.cols=N; t.nums=0; for(i=0;i<M;i++) { for(j=0;j<N;j++) { if(A[i][j]!=0) { t.data[t.nums].r=i; t.data[t.nums].c=j; t.data[t.nums].d=A[i][j]; t.nums++; } } } } bool Value(TSMatrix &t,ElemType x,int i,int j) { int k=0,k1; if(i>=t.rows||j>=t.cols) return false; while(k<t.nums&&i>t.data[k].r) { k++; } while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c) { k++; } if(t.data[k].r==i&&t.data[k].c==j) { t.data[k].d=x; } else { for(k1=t.nums-1;k1>=k;k1--) { t.data[k1+1].r=t.data[k1].r; t.data[k1+1].c=t.data[k1].c; t.data[k1+1].d=t.data[k1].d; } t.data[k].r=i; t.data[k].c=j; t.data[k].d=x; t.nums++; } return true; } bool Assign(TSMatrix t,ElemType &x,int i,int j) { int k=0; if(i>=t.rows||j>=t.cols) return false; while(k<t.nums&&i>t.data[k].r) { k++; } while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c) { k++; } if(t.data[k].r==i&&t.data[k].c==j) x=t.data[k].d; else x=0; return false; } void DispMat(TSMatrix t) { int i; if(t.nums<=0) { return ; } printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums); printf("\t------------------\n"); for (i=0; i<t.nums; i++) printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d); } bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c) { int i,j; ElemType va,vb,vc; if (a.rows!=b.rows || a.cols!=b.cols) return false; //行数或列数不等时不能进行相加运算 c.rows=a.rows; c.cols=a.cols; //c的行列数与a的相同 c.nums=0; for(i=0; i<M; i++) for(j=0; j<N; j++) { Assign(a,va,i,j); Assign(b,vb,i,j); vc=va+vb; if(vc) Value(c,vc,i,j); } return true; } #include"tup.h"void CreatMat(TSMatrix &t,ElemType A[M][N]){ int i,j; t.rows=M; t.cols=N; t.nums=0; for(i=0;i<M;i++) { for(j=0;j<N;j++) { if(A[i][j]!=0) { t.data[t.nums].r=i; t.data[t.nums].c=j; t.data[t.nums].d=A[i][j]; t.nums++; } } }}bool Value(TSMatrix &t,ElemType x,int i,int j){ int k=0,k1; if(i>=t.rows||j>=t.cols) return false; while(k<t.nums&&i>t.data[k].r) { k++; } while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c) { k++; } if(t.data[k].r==i&&t.data[k].c==j) { t.data[k].d=x; } else { for(k1=t.nums-1;k1>=k;k1--) { t.data[k1+1].r=t.data[k1].r; t.data[k1+1].c=t.data[k1].c; t.data[k1+1].d=t.data[k1].d; } t.data[k].r=i; t.data[k].c=j; t.data[k].d=x; t.nums++; } return true;}bool Assign(TSMatrix t,ElemType &x,int i,int j){ int k=0; if(i>=t.rows||j>=t.cols) return false; while(k<t.nums&&i>t.data[k].r) { k++; } while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c) { k++; } if(t.data[k].r==i&&t.data[k].c==j) x=t.data[k].d; else x=0; return false;}void DispMat(TSMatrix t){ int i; if(t.nums<=0) { return ; } printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums); printf("\t------------------\n"); for (i=0; i<t.nums; i++) printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d);}bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c){ int i,j; ElemType va,vb,vc; if (a.rows!=b.rows || a.cols!=b.cols) return false; //行数或列数不等时不能进行相加运算 c.rows=a.rows; c.cols=a.cols; //c的行列数与a的相同 c.nums=0; for(i=0; i<M; i++) for(j=0; j<N; j++) { Assign(a,va,i,j); Assign(b,vb,i,j); vc=va+vb; if(vc) Value(c,vc,i,j); } return true;}
#include "tup.h" int main() { TSMatrix ta,tb,tc; int A[M][N]= { {0,0,1,0,0,0,0}, {0,2,0,0,0,0,0}, {3,0,0,0,0,0,0}, {0,0,0,5,0,0,0}, {0,0,0,0,6,0,0}, {0,0,0,0,0,7,4} }; int B[M][N]= { {0,0,10,0,0,0,0}, {0,0,0,20,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,50,0,0,0}, {0,0,20,0,0,0,0}, {0,0,0,10,0,0,4} }; CreatMat(ta,A); CreatMat(tb,B); printf("A:\n"); DispMat(ta); printf("B:\n"); DispMat(tb); if(MatAdd(ta, tb, tc)) { printf("A+B:\n"); DispMat(tc); } else { printf("相加失败\n"); } return 0; }
运行结果:
<img src="http://img.blog.csdn.net/20151213143831098?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结:
采用三元组存储稀疏矩阵的算法,将两个稀疏矩阵相加
0 0
- 稀疏矩阵相加
- 第九周 稀疏矩阵相加
- 项目 3.1 - 稀疏矩阵相加
- 数据结构实践——稀疏矩阵相加
- 第九周项目三~~~稀疏矩阵相加
- 第九周项目三稀疏矩阵相加
- 第九周--数据结构--稀疏矩阵相加
- 数据结构关于稀疏矩阵相加问题
- 11.十字链表 实现 稀疏矩阵 及 矩阵相加
- 稀疏矩阵相加(十字链表实现)
- 稀疏矩阵相加(十字链表存储)
- 稀疏矩阵三元组的相加相乘运算
- 稀疏矩阵的运算(相乘,输出,转置,相加)
- 第九周 项目3-2 两稀疏矩阵相加
- 第九周--数据结构--稀疏矩阵相加(之二)
- 第九周项目三(2)稀疏矩阵相加
- 第九周 项目3 两个稀疏矩阵的相加运算
- 第九周项目6—稀疏矩阵相加
- oracle临时表的使用(未完)
- Android CheckBox 简要描述(随记五)
- [开源学习]SwipeMenuListView源码实现过程解析
- Java transient关键字
- 飞机最少换乘(迪杰斯特拉实验)
- 稀疏矩阵相加
- 安装linux学习六(2):nginx负载均衡
- [Leetcode]Reverse Words in a String
- 解决 Android Studio 错误:需要常量表达式
- Java 处理 XML 的三种主流技术及介绍
- git 应用
- 使用JAVA找出一组数据的最大值
- 迭代器的问题 http://www.nowcoder.com/test/question/done?tid=2198842&qid=5962#summary
- PLSQL查询表是否被锁定(转)