我是靠谱客的博主 合适小土豆,这篇文章主要介绍稀疏矩阵的乘法运算 | C++ | 稀疏矩阵,现在分享给大家,希望可以做个参考。

一、题目描述

数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。

本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.

输入

第1个稀疏矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

第2个稀疏矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组
   

以行为主序输入稀疏矩阵三元组表

输出

       乘积矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 3↵
  2. 4↵
  3. 4↵
  4. 1 1 3↵
  5. 1 4 5↵
  6. 2 2 -1↵
  7. 3 1 2↵
  8. 4↵
  9. 2↵
  10. 4↵
  11. 1 2 2↵
  12. 2 1 1↵
  13. 3 1 -2↵
  14. 3 2 4↵
以文本方式显示
  1. 3↵
  2. 2↵
  3. 3↵
  4. 1,2,6↵
  5. 2,1,-1↵
  6. 3,2,4↵
1秒256KB0

二、思路分析

1、读入稀疏矩阵A。

2、读入稀疏矩阵B。

3、计算矩阵C。

4、输出C。


完整代码

复制代码
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#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++ | 稀疏矩阵的全部内容,更多相关稀疏矩阵的乘法运算内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(81)

评论列表共有 0 条评论

立即
投稿
返回
顶部