稀疏矩阵相乘
2017-11-14 18:59
232 查看
对于用三元组实现稀疏矩阵相乘的算法,首先构造一个结构体,结构图体中应该有五个量。其中第一个量是表示稀疏矩阵常用的三元组,定义如下:
下面是结构体的完整定义:
定义好结构体之后,我们要对结构体表示的矩阵实现矩阵相乘算法(注释已经写好了):
之后在主函数中初始化M和N,并进行计算
这样就完成了稀疏矩阵相乘的操作,也可以自己根据需要修改主函数
typedef struct{ int i, j; //该非零元素行列下标 ElemType e; }Triple; /*--------稀疏矩阵的三元组顺序表存储表示-------*/
下面是结构体的完整定义:
typedef struct { Triple data[MAXSIZE+1]; //三元组 int num[MAXRC]; //一个数组记录矩阵每一行非零元个数 int rpos [MAXRC+1]; //一个数组记录第一个非零元个数 int mu, nu, tu; // . }RLSMatrix;
定义好结构体之后,我们要对结构体表示的矩阵实现矩阵相乘算法(注释已经写好了):
Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix &Q) { if (M.nu != N.mu)return ERROR; Q.mu = M.mu; Q.nu = N.nu; Q.tu = 0; if (M.tu*N.tu != 0) { // 说明Q是非零矩阵 int ctemp[100]; // 设置累加器ctemp数组 int brow; for (int col = 1; col < M.mu; ++col) { //将表示M,N每行元素非零元个数的数组初始化 M.num[col] = 0; N.num[col] = 0; } for (int t = 1; t <= M.tu; ++t) { ++M.num[M.data[t].i]; }for (int t = 1; t <= N.tu; ++t) { ++N.num[N.data[t].i]; } //求出M,N每行元素非零元个数 M.rpos[1] = 1; N.rpos[1] = 1; for (int col = 2; col <= M.mu; ++col) { M.rpos[col] = M.rpos[col - 1] + M.num[col - 1]; N.rpos[col] = N.rpos[col - 1] + N.num[col - 1]; } //通过计算得出每行第一个非零元在三元组中的位置并将其放入rpos数组 for (int arow = 1;arow<=M.mu;arow++) { for (int j = 1; j <= N.nu; j++) ctemp[j] = 0;//初始化累加器 Q.rpos[arow] = Q.tu + 1; int tp; if (arow < M.mu)tp = M.rpos[arow + 1]; else { tp = M.tu + 1; } for (int p = M.rpos[arow]; p < tp; ++p) { brow = M.data[p].j; //找到每行第一个非零元的列下标,此下标在N中对应一个行号 int t; if (brow < N.mu)t = N.rpos[brow + 1]; else { t = N.tu + 1; } //如果对应行不超过N的行数,设置t为下一行首字母下标,否则,则设置t为最后一个非零元下标 for (int q = N.rpos[brow]; q < t; ++q) { int ccol = N.data[q].j; ctemp[ccol]+= M.data[p].e*N.data[q].e; //在不超过t的范围内做对应乘和累加操作 } } for(int ccol = 1;ccol<=Q.nu;++ccol) { if (ctemp[ccol]) { if (++Q.tu > MAXSIZE)return ERROR; //将该行非零元放入Q的三元组 Q.data[Q.tu].i = arow; Q.data[Q.tu].j = ccol; Q.data[Q.tu].e=ctemp[ccol]; } } } } return OK; }
之后在主函数中初始化M和N,并进行计算
int main(){ RLSMatrix *a, *b, c; a = (RLSMatrix*)malloc(sizeof(RLSMatrix)); b = (RLSMatrix*)malloc(sizeof(RLSMatrix)); cout<<"请输入A矩阵的行列式和非零元素的值"<<endl; cin>> a->mu >> a->nu >> a->tu; for (int i = 1; i <=a->tu; i++) cin >> a->data[i].i >> a->data[i].j >> a->data[i].e; cout << "请输入B矩阵的行列式和非零元素的值" << endl; cin >> b->mu >> b->nu >> b->tu; for (int i = 1; i <= b->tu; i++) cin >> b->data[i].i >> b->data[i].j >> b->data[i].e; if (!MultSMatrix(*a, *b, c)) { cout << "矩阵无法相乘" <<endl; } else { cout<<"结果如下"<<endl; } cout <<c.mu<<"\t"<<c.nu<<"\t"<<c.tu; for (int i = 1; i <= c.tu; i++) { cout << "\n" << c.data[i].i << "\t" << c.data[i].j << "\t" << c.data[i].e; } free(a); free(b); a = NULL; b = NULL; system("pause"); }
这样就完成了稀疏矩阵相乘的操作,也可以自己根据需要修改主函数
相关文章推荐
- 稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结
- 稀疏矩阵相乘
- 稀疏矩阵相乘——三元组稀疏矩阵
- 稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结
- 稀疏矩阵三元组的相加相乘运算
- 稀疏矩阵利用三元组相乘(c语言)
- 基于十字链表的两个稀疏矩阵相乘
- HDU 4920 Matrix multiplication 矩阵相乘。稀疏矩阵
- 稀疏矩阵相乘
- 稀疏矩阵的运算(相乘,输出,转置,相加)
- 数据结构--稀疏矩阵(相乘)
- 10.稀疏矩阵的存储 转置 相乘
- HDU 4920 稀疏矩阵相乘
- 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
- [LeetCode] 311. Sparse Matrix Multiplication 稀疏矩阵相乘
- 实现稀疏矩阵相乘C/C++
- 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
- 数组与广义表_稀疏矩阵的压缩存储_三元组做存储结构_矩阵相乘
- [LeetCode] Sparse Matrix Multiplication 稀疏矩阵相乘
- 稀疏矩阵相乘