我是靠谱客的博主 合适小土豆,最近开发中收集的这篇文章主要介绍稀疏矩阵的乘法运算 | 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。


完整代码

#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++ | 稀疏矩阵所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部