稀疏矩阵及其实现
2017-11-10 18:37
323 查看
稀疏矩阵及其实现
这一节用到了数组的一些知识,和线代中矩阵的计算方法。建议没有基础的读者去看一下矩阵的相关知识。和之前的博客一样,这次依然参考了严蔚敏的《数据结构(C语言版)》。
稀疏矩阵的预定义
/*--------稀疏矩阵的三元组顺序表存储表示----------*/ typedef int ElemType; #define MAXSIZE 12500 // 假设非零元个数的最大数值为12500 typedef struct { int i, j; // 该非零元的行下标和列下标 ElemType e; }Triple; typedef struct { Triple data[MAXSIZE + 1]; int mu, nu, tu; // 矩阵的行数、列数、和非零元个数 }TSMatrix; /*--------------数据结构定义结束---------------*/
一些基本方法
/*-----------------基本操作-------------------*/ /*创建稀疏矩阵M*/ Status CreateSMatrix(TSMatrix *M){ if (!M)return ERROR; //若空间分配失败,则返回ERROR // 让矩阵初始行列数都为0,非零元个数也为0 M->mu = 0; M->nu = 0; M->tu = 0; return OK; } /*销毁稀疏矩阵*/ Status DestroySMatrix(TSMatrix *M){ free(M); if (M)return ERROR; //若M仍存在,则销毁失败,返回ERROR return OK; } /*给稀疏矩阵赋值*/ Status Assign(TSMatrix *M){ int p, q, r, t = 0; for (p = 0; p < M->mu; p++){ for (q = 0; q < M->nu; q++){ printf_s("[%d][%d] = ", p + 1, q + 1); scanf_s("%d", &r); if (r != 0){ t++; M->data[t].i = p + 1; M->data[t].j = q + 1; M->data[t].e = r; } } } M->tu = t; return OK; } /*输出稀疏矩阵*/ void PrintSMatrix(TSMatrix M){ int m; for (m = 1; m <= M.tu; m++){ printf_s("======[%d][%d] = %d\n", M.data[m].i, M.data[m].j, M.data[m].e); } } /*由稀疏矩阵M复制得到T*/ Status CopySMatrix(TSMatrix M, TSMatrix *T){ CreateSMatrix(T); if (!T)return ERROR; //将M的行列数以及非零元的个数赋给T T->mu = M.mu; T->nu = M.nu; T->tu = M.tu; //将M的data数组赋给T int m; for (m = 1; m < M.tu; m++){ T->data[m].i = M.data[m].i; T->data[m].j = M.data[m].j; T->data[m].e = M.data[m].e; } return OK; } /*若稀疏矩阵M与N的行数和列数对应相等,求稀疏矩阵的和Q = M + N*/ Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q){ if (M.mu != N.mu || M.nu != N.nu)return ERROR; //若行数和列数不对应相等,则返回ERROR CreateSMatrix(Q); //给Q设置行数和列数 Q->mu = M.mu; Q->nu = M.nu; int m, n, q; //设立m,n,q来计算矩阵元素个数 m = 1; n = 1; q = 0; while (m < M.tu && n < N.tu){ if (M.data[m].i == N.data .i){ if (M.data[m].j == N.data[n].j){ q++; Q->data[q].i = M.data[m].i; //Q.data[q]的行下标为M.data[m]的行下表 Q->data[q].j = M.data[m].j; //Q.data[q]的列下标为M.data[m]的列下表 Q->data[q].e = M.data[m].e + N.data[n].e; //Q.data[q]的数值为两个矩阵对应位置的数值之和 m++; n++; } else if (M.data[m].j < N.data .j){ q++; Q->data[q].i = M.data[m].i; Q->data[q].j = M.data[m].j; Q->data[q].e = M.data[m].e; m++; } else if (M.data[m].j > N.data .j){ q++; Q->data[q].i = N.data[n].i; Q->data[q].j = N.data[n].j; Q->data[q].e = N.data[n].e; n++; } } else if (M.data[m].i < N.data .i){ q++; Q->data[q].i = M.data[m].i; Q->data[q].j = M.data[m].j; Q->data[q].e = M.data[m].e; m++; } else if (M.data[m].i > N.data .i){ q++; Q->data[q].i = M.data[m].i; Q->data[q].j = M.data[m].j; Q->data[q].e = M.data[m].e; m++; } } //当有矩阵非零元用完了之后,处理剩下的一个矩阵中的剩余元素 while (m <= M.tu){ q++; Q->data[q].i = M.data[m].i; Q->data[q].j = M.data[m].j; Q->data[q].e = M.data[m].e; m++; } while (n <= N.tu){ q++; Q->data[q].i = N.data .i; Q->data[q].j = N.data .j; Q->data[q].e = N.data .e; n++; } Q->tu = q; return OK; } /*若稀疏矩阵M与N的行数和列数对应相等,求稀疏矩阵的差 Q = M - N*/ Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q){ //这个方法实际上就是对AddSMatrix(M, -N, Q)的实现 return OK; }
相关文章推荐
- 稀疏矩阵的存储方式及其快速转置的实现
- 源代码——三元组实现稀疏矩阵及其转置
- 第9周项目三--稀疏矩阵的三元组表示的实现及应用(2)
- 第九周项目三----稀疏矩阵的三元组表示的实现及应用1
- C语言 稀疏矩阵 压缩 实现
- 第9周项目3-稀疏矩阵的三元组表示的实现及应用(1)
- 第9周项目3-稀疏矩阵的三元组表示的实现及应用(2)
- 第九周项目3-稀疏矩阵的三元组表示的实现及应用(2)
- 第九周项目3-稀疏矩阵的三元组表示的实现及应用(2)
- 稀疏矩阵基于“三元组”的转置算法实现
- 第八周项目4-稀疏矩阵的三元组表示的实现及应用
- Hessian矩阵提取特征点原理及其Matlab实现
- C/C++ 第八周串和数组 (一)稀疏矩阵的三元组表示的实现及应用 项目4—(1)
- 第九周 稀疏矩阵的三元组表示的实现和应用
- 稀疏矩阵的三元组顺序表的C语言实现
- C++实现稀疏矩阵的压缩存储、转置、快速转置
- 第九周项目3-稀疏矩阵的三元组表示的实现及应用(2)
- 【第9周项目3-稀疏矩阵的三元组表示的实现及应用(2)】
- 【第九周 项目3-稀疏矩阵的三元组表示的实现及应用(1)】
- 第九周项目3-稀疏矩阵的三元组的实现及应用