概述
一、题目描述
数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。
本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.
输入:
第1个稀疏矩阵的行数
列数
非零元个数(三个数都大于0)
三元组第2个稀疏矩阵的行数
列数
非零元个数(三个数都大于0)
三元组以行为主序输入稀疏矩阵三元组表
输出:
乘积矩阵的行数
列数
非零元个数(三个数都大于0)
三元组
测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示
- 3↵
- 4↵
- 4↵
- 1 1 3↵
- 1 4 5↵
- 2 2 -1↵
- 3 1 2↵
- 4↵
- 2↵
- 4↵
- 1 2 2↵
- 2 1 1↵
- 3 1 -2↵
- 3 2 4↵
以文本方式显示
- 3↵
- 2↵
- 3↵
- 1,2,6↵
- 2,1,-1↵
- 3,2,4↵
1秒 256KB 0
二、思路分析
1、读入稀疏矩阵A。
2、读入稀疏矩阵B。
3、计算矩阵C。
4、输出C。
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
typedef struct {
int row, col, data;
} elem;
typedef struct {
elem *element = (elem*) malloc ( N*sizeof(elem) ) ;
int ROW, COL, NZRO=0;
} Triplet;
//输出
void printC(Triplet C) {
printf("%dn%dn%dn",C.ROW,C.COL,C.NZRO);
for (int i=0; i<C.ROW*C.COL; i++) {
if (C.element[i].data!=0) {
printf("%d,%d,%dn",C.element[i].row+1,C.element[i].col+1,C.element[i].data);
}
}
}
int main(){
void printC(Triplet);
Triplet A,B,C;
//第一个稀疏矩阵A
scanf("%d %d %d",&A.ROW,&A.COL,&A.NZRO);
for (int i=0; i<A.NZRO; i++) {
scanf("%d %d %d",&A.element[i].row,&A.element[i].col,&A.element[i].data);
A.element[i].row--; A.element[i].col--;
}
//补充说明:题目读入的矩阵下标从1开始,而我是从0开始,所以这里对row和col都进行-1的操作。下面的B同理。
//第二个稀疏矩阵B
scanf("%d %d %d",&B.ROW,&B.COL,&B.NZRO);
for (int i=0; i<B.NZRO; i++) {
scanf("%d %d %d",&B.element[i].row,&B.element[i].col,&B.element[i].data);
B.element[i].row--; B.element[i].col--;
}
//第三个矩阵C
C.ROW = A.ROW; C.COL = B.COL;
//初始化第三个矩阵
for (int i=0; i<C.ROW; i++) {
for (int j=0; j<C.COL; j++) {
C.element[ i*C.COL+j ].data = 0;
C.element[ i*C.COL+j ].row = i;
C.element[ i*C.COL+j ].col = j;
}
}
//计算过程在这里
for (int i=0; i<A.NZRO; i++) {
for (int j=0; j<B.NZRO; j++) {
int d = 0;
if (A.element[i].col==B.element[j].row)
d = A.element[i].data * B.element[j].data; //d是乘法计算的结果
//如果d不为0,则将其加到相应的位置上
if (d!=0) {
C.element[ A.element[i].row*C.COL+B.element[j].col ].data += d;
if ( C.element[A.element[i].row*C.COL+B.element[j].col].data==0 ) C.NZRO--;
else if ( C.element[A.element[i].row*C.COL+B.element[j].col].data==d ) C.NZRO++;
}
}
}
printC(C);
return 0;
}
最后
以上就是合适小土豆为你收集整理的稀疏矩阵的乘法运算 | C++ | 稀疏矩阵的全部内容,希望文章能够帮你解决稀疏矩阵的乘法运算 | C++ | 稀疏矩阵所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复