分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
本文针对数据结构基础系列网络课程(5):数组与广义表的实践项目。
【项目 - 稀疏矩阵相加】
采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法
提示1:两个行数、列数相同的矩阵可以相加
提示2:充分利用已经建立好的算法库解决问题
[参考解答1](程序中使用的头文件”tup.h”见稀疏矩阵的三元组表示算法库)
#include <stdio.h>#include "tup.h"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;}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;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
[参考解答2]
下面给出的解答,没有利用算法库中已经实现的Assign和Value两个基本运算,而是直接e采取了更为直接的方法去完成。用i和j两个变量扫描三元组a和b,按行序优先的原则进行处理,将结果存放于c中。当a的当前元素和b的当前元素的行号和列号均相等时,将它们的值相加,只有在相加值不为0时,才在c中添加一个新的元素。
#include <stdio.h>#include "tup.h"bool MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c){ int i=0,j=0,k=0; ElemType v; if (a.rows!=b.rows || a.cols!=b.cols) return 0; //行数或列数不等时不能进行相加运算 c.rows=a.rows; c.cols=a.cols; //c的行列数与a的相同 while (i<a.nums && j<b.nums) //处理a和b中的每个元素 { if (a.data[i].r==b.data[j].r) //行号相等时 { if(a.data[i].c<b.data[j].c) //a元素的列号小于b元素的列号 { c.data[k].r=a.data[i].r;//将a元素添加到c中 c.data[k].c=a.data[i].c; c.data[k].d=a.data[i].d; k++; i++; } else if (a.data[i].c>b.data[j].c)//a元素的列号大于b元素的列号 { c.data[k].r=b.data[j].r; //将b元素添加到c中 c.data[k].c=b.data[j].c; c.data[k].d=b.data[j].d; k++; j++; } else //a元素的列号等于b元素的列号 { v=a.data[i].d+b.data[j].d; if (v!=0) //只将不为0的结果添加到c中 { c.data[k].r=a.data[i].r; c.data[k].c=a.data[i].c