稀疏矩阵操作(三元组表示法)

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #define OK 1
  4. #define ERROR 0
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define MAXSIZE 100
  8. typedef int Status;
  9. typedef float ElemType;
  10. typedef struct{//三元组结构
  11. int i, j;//非零元素行下标和列下标
  12. ElemType e;//非零元素值
  13. }Triple;
  14. typedef struct{
  15. Triple data[MAXSIZE + 1];//非零元三元组表,data[0]不用
  16. int mu, nu, tu;//矩阵的行数、列数和非零元素个数
  17. }TSMatrix;
  18. TSMatrix NewMatrix(int m, int n);
  19. //新建一个三元组表示的稀疏矩阵
  20. Status InsertElem(TSMatrix *M, int row, int col, ElemType e);
  21. //在三元组表示的稀疏矩阵M,第 row 行,第 col 列位置插入元素e
  22. //插入成功,返回OK,否则返回ERROR
  23. Status FindElem(const TSMatrix *M, int row, int col, ElemType *e);
  24. //查找三元组表示的稀疏矩阵M中,第 row 行,第 col列元素,若不为0,
  25. //则用e返回其值,并返回TRUE,否则返回FALSE
  26. Status TransposeSMatrix(const TSMatrix *M, TSMatrix *T);
  27. //采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
  28. Status FastTransposeSMatrix(const TSMatrix *M, TSMatrix *T);
  29. //利用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
  30. Status MultSMatrix(const TSMatrix *M, const TSMatrix *T, TSMatrix *Q);
  31. //稀疏矩阵的乘法,如果符合乘法规则,Q返回M*T结果,并返回OK,否则返回ERROR
  32. void PrintSMatrix(const TSMatrix *M);
  33. //打印稀疏矩阵所有元素
  34. int main()
  35. {
  36. TSMatrix M = NewMatrix(3, 4);
  37. TSMatrix T;
  38. TSMatrix Q;
  39. InsertElem(&M, 3, 2, 3.65);
  40. InsertElem(&M, 2, 2, 2.31);
  41. printf("\nM:");
  42. PrintSMatrix(&M);
  43. FastTransposeSMatrix(&M, &T);
  44. printf("\nT(Transpose of M):");
  45. PrintSMatrix(&T);
  46. MultSMatrix(&M, &T, &Q);
  47. printf("\nM*T=");
  48. PrintSMatrix(&Q);
  49. return 0;
  50. }
  51. TSMatrix NewMatrix(int m, int n){
  52. //新建一个三元组表示的稀疏矩阵
  53. TSMatrix M;
  54. M.mu = m;
  55. M.nu = n;
  56. M.tu = 0;
  57. return M;
  58. }
  59. Status InsertElem(TSMatrix *M, int row, int col, ElemType e){
  60. //在三元组表示的稀疏矩阵M,第 row 行,第 col 列位置插入元素e
  61. //插入成功,返回OK,否则返回ERROR
  62. int i, t, p;
  63. if (M->tu >= MAXSIZE){//当前三元组表已满
  64. printf("\nError:There is no space in the matrix;\n");
  65. return ERROR;
  66. }
  67. if (row>M->mu || col>M->nu || row<1 || col<1){//插入位置越界,不在1~mu或1~nu之间
  68. printf("\nError:Insert position is beyond the arrange.\n");
  69. return ERROR;
  70. }
  71. p = 1;//标志新元素应该插入的位置
  72. if (M->tu == 0){//插入前矩阵M没有非零元素
  73. M->data[p].i = row;
  74. M->data[p].j = col;
  75. M->data[p].e = e;
  76. M->tu++;
  77. return OK;
  78. }
  79. for (t = 1; t <= M->tu; t++)//寻找合适的插入位置
  80. if ((row >= M->data[t].i) && (col >= M->data[t].j))
  81. p++;
  82. if (row == M->data[t - 1].i && col == M->data[t - 1].j){//插入前,该元素已经存在
  83. M->data[t - 1].e = e;
  84. return OK;
  85. }
  86. for (i = M->tu; i >= p; i--){//移动p之后的元素
  87. M->data[i + 1].i = M->data[i].i;
  88. M->data[i + 1].j = M->data[i].j;
  89. M->data[i + 1].e = M->data[i].e;
  90. }
  91. //插入新元素
  92. M->data[p].i = row;
  93. M->data[p].j = col;
  94. M->data[p].e = e;
  95. M->tu++;
  96. return OK;
  97. }
  98. Status FindElem(const TSMatrix *M, int row, int col, ElemType *e){
  99. //查找三元组表示的稀疏矩阵M中,第 row 行,第 col列元素,若不为0,
  100. //则用e返回其值,并返回TRUE,否则返回FALSE
  101. int p;
  102. for (p = 1; p <= M->tu; p++)
  103. if (M->data[p].i == row&&M->data[p].j == col){
  104. *e = M->data[p].e;
  105. return TRUE;
  106. }
  107. return FALSE;
  108. }
  109. Status TransposeSMatrix(const TSMatrix *M, TSMatrix *T){
  110. //采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
  111. int col, p, q;
  112. T->mu = M->nu; T->nu = M->mu; T->tu = M->tu;
  113. if (T->tu){
  114. q = 1;
  115. for (col = 1; col <= M->mu; col++)
  116. for (p = 1; p <= M->tu; p++)
  117. if (M->data[p].j == col){
  118. T->data[q].i = M->data[p].j;
  119. T->data[q].j = M->data[p].i;
  120. T->data[q].e = M->data[p].e;
  121. q++;
  122. }
  123. }
  124. return OK;
  125. }
  126. Status FastTransposeSMatrix(const TSMatrix *M, TSMatrix *T){
  127. //利用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
  128. int col, t, p, q, *num, *cpot;
  129. T->mu = M->nu; T->nu = M->mu; T->tu = M->tu;
  130. if (T->tu){
  131. num = (int *)malloc(sizeof(int)*M->tu);
  132. cpot = (int *)malloc(sizeof(int)*M->tu);
  133. if (!(num&&cpot)){
  134. printf("Apply for memory error.\n");
  135. exit(0);
  136. }
  137. for (col = 1; col <= M->nu; col++) num[col] = 0;
  138. //求M中每一列含有非零元素的个数
  139. for (t = 1; t <= M->tu; t++) ++num[M->data[t].j];
  140. cpot[1] = 1;
  141. //求第col列中第一个非零元素在b.data中的序号
  142. for (col = 2; col <= M->nu; col++)
  143. cpot[col] = cpot[col - 1] + num[col - 1];
  144. for (p = 1; p <= M->tu; p++){
  145. col = M->data[p].j; q = cpot[col];
  146. T->data[q].i = M->data[p].j;
  147. T->data[q].j = M->data[p].i;
  148. T->data[q].e = M->data[q].e;
  149. ++cpot[col];
  150. }//for
  151. }//if
  152. return OK;
  153. }
  154. Status MultSMatrix(const TSMatrix *M, const TSMatrix *T, TSMatrix *Q){
  155. //稀疏矩阵的乘法,如果符合乘法规则,Q返回M*T结果,并返回OK,否则返回ERROR
  156. int i, j, k, p;
  157. ElemType m, t, s;
  158. if (M->nu != T->mu){
  159. printf("Sorry,these two matrice can‘t multiply.\n");
  160. return ERROR;
  161. }
  162. Q->mu = M->mu; Q->nu = T->nu; Q->tu = 0;
  163. p = 1;
  164. for (i = 1; i <= Q->mu; i++){
  165. for (j = 1; j <= Q->nu; j++){
  166. s = 0;
  167. for (k = 1; k <= M->nu; k++){
  168. if (FALSE == FindElem(M, i, k, &m))
  169. continue;
  170. if (FALSE == FindElem(T, k, j, &t))
  171. continue;
  172. s += m*t;
  173. }
  174. if (s != 0){//Q[i][j]非零
  175. Q->data[p].i = i;
  176. Q->data[p].j = j;
  177. Q->data[p].e = s;
  178. p++;
  179. Q->tu++;
  180. }
  181. }
  182. }
  183. return OK;
  184. }
  185. void PrintSMatrix(const TSMatrix *M){
  186. //打印稀疏矩阵所有元素
  187. int i, j, p = 1;
  188. printf("\nsize:%d × %d\n", M->mu, M->nu);
  189. if (!M->tu){//0矩阵
  190. printf("%g\n", 0.0);
  191. return;
  192. }
  193. for (i = 1; i <= M->mu; i++){
  194. for (j = 1; j <= M->nu; j++){
  195. if (i == M->data[p].i && j == M->data[p].j){
  196. printf("%g\t", M->data[p].e);
  197. p++;
  198. }
  199. else{
  200. printf("%g\t", 0.0);
  201. }
  202. }
  203. printf("\n");
  204. }
  205. printf("\n");
  206. }

来自为知笔记(Wiz)

时间: 2024-11-08 14:26:11

稀疏矩阵操作(三元组表示法)的相关文章

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

数据结构(二):线性表的使用原则以及链表的应用-稀疏矩阵的三元组表示

上一篇博文中主要总结线性表中的链式存储结构实现,比如单向链表.循环链表,还通过对比链表和顺序表的多项式的存储表示,说明链表的优点.可以参看上篇博文http://blog.csdn.net/lg1259156776/article/details/47018813 下面先对没有介绍的链表中的双链表进行介绍,并通过稀疏矩阵的三元组的链式结构来深入理解较为复杂的链表存储结构.最后对三次博文所讲述的内容进行梳理,以帮助在实际应用中选择最合适的存储结构:顺序表和链表,来组织实现自己的算法和功能. 双向链表

稀疏矩阵的三元组顺序表的C语言实现

对于没有排序功能的集合来说,都可以使用java.util.Collections.sort()方法进行排序,它除了集合对象以外,还需要提供一个比较器.如果列表中的元素全部都是相同的类型,并且这个类实现了Comparable接口,就可以简单的调用Collections.sort()方法,如果这个类没有实现comparable接口,那么可以创建一个比较器传递一个Comparator实例作为Sort()的第二个参数进行排序,另外,如果不想使用默认的分类顺序进行排序,同样也可以传递一个Comparato

数据结构之自建算法库——稀疏矩阵的三元组表示

本文针对数据结构基础系列网络课程(5):数组与广义表中第3课时稀疏矩阵的三元组表示. 稀疏矩阵的三元组表示相关的算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:tup.h,包含定义稀疏矩阵的三元组表示数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef TUP_H_INCLUDED #define TUP_H_INCLUDED #define M 6 #define N 7 #define MaxSize 100 //矩阵中非零元素最多个数 typedef int Ele

数据结构学习--稀疏矩阵的三元组表示

// 稀疏矩阵的三元组表示 #include <stdio.h> #define M 6 #define N 7 #define MaxSize M*N typedef int ElemType; struct TupNode { int i, j; ElemType data; }; class TSMatrix { private: int rows, cols, nums; struct TupNode data[MaxSize]; public: TSMatrix(ElemType A

[DataStructure]稀疏矩阵的三元组存储及乘法运算

P.S.我去..我大作业不会打成系数矩阵了吧!!!!!!!!!!! 一.题目描述: 对于一个Rows X Columns稀疏矩阵,使用三元组的方法进行存储. 并在此基础上计算矩阵的乘法 二.解题报告 1.建立结构_Matrix 1 MAXVALUE为预估零元峰值个数, 2 struct _Matrix 3 { 4 int Sum;//实际输入总非零点数 5 int Rows,Columns;//矩阵行数,列数 6 double Data[MAXVALUE+1];//数据域,第i个数据的值 7 i

稀疏矩阵的三元组顺序表存储结构表示及实现

#define MAX_SIZE 100 struct Triple { int i, j;//行下标,列下标 ElemType e;//非零元素值 }; struct TSMatrix { Triple data[MAX_SIZE + 1];//非零元三元组表,data[0]未用 int mu, nu, tu;//矩阵的行数,列数,非零元个数 }; int comp(int c1, int c2){//比较这个数c1和c2的大小关系 if (c1 < c2) return -1; if (c1

稀疏矩阵的三元组行逻辑链接的顺序表存储结构表示及实现

#define MAX_SIZE 100 #define MAX_RC 20 struct Triple { int i, j;//行下标,列下标 ElemType e;//非零元素值 }; struct RLSMatrix { Triple data[MAX_SIZE + 1];//非零元三元组表,data[0]未用 int rpos[MAX_RC + 1];//各行第1个非零元素的位置表 int mu, nu, tu;//矩阵的行数,列数,非零元个数 }; int comp(int c1,

稀疏矩阵操作算法

测试: demo.cpp #include "trituple.h" #include <iostream> using namespace std; int main(){ Trituple data1; Trituple data2; cout << "功能演示==========================================" << endl; cout << "功能1:输入已压缩的稀