c++实现稀疏矩阵的压缩存储

本程序利用面向对象的c++实现稀疏矩阵的压缩存储。

还请路过的大神指点指点。

#include <iostream>
#include <algorithm>
#include <vector>
#include <iomanip>

using namespace std;

class FullMatrix{
	public:
	//定义成员函数 
		FullMatrix();
		FullMatrix(vector<vector<float> > &A);
		~FullMatrix();
		
		void print(); 
		void compress();
		void full();
	private:
		int Row;
		int Column;
		int NonZeroNumber=0;
		bool iscompressed = false; 
		vector<vector<float> > Matrix;				
};

//成员函数定义;
FullMatrix::FullMatrix(vector<vector<float> > &A){
	Row = A.size();
	Column = A[0].size();
	for(int i = 0;i < Row;i++ ){
		for(int j = 0;j < Column;j++){
			if(A[i][j] != 0){
				++NonZeroNumber;
			}
		}
	}
	
	Matrix = A;
}

FullMatrix::~FullMatrix(){
	delete[] this;
}

void FullMatrix::print(){
	for(int i = 0;i < Matrix.size() ; i++){
		for(int j = 0; j < Matrix[i].size(); j++){
			cout<< setw(4) << Matrix[i][j] << " ";  
		}
		cout<<endl; 
	} 
}

void FullMatrix::compress(){
	if(iscompressed){
		cout<<"Already compressed!"<<endl;
		return ;
	}
	
	iscompressed = true;
	
	int k = 0;
	vector<vector<float> > CompressForm(NonZeroNumber + 1, vector<float>(3));
	CompressForm[0] = {(float)Row, (float)Column, (float)NonZeroNumber};
	for(int i = 0; i < Row;i++){
		for(int j = 0; j < Column; j++){
			if(Matrix[i][j] != 0){
				CompressForm[++k] = {(float)i+1, (float)j+1, Matrix[i][j]};
			}
		}
	}
	
	Matrix.clear();
	Matrix = CompressForm;
	Matrix.shrink_to_fit();
	//Matrix.erase(Matrix.end());
	
}

void FullMatrix::full(){
	if(!iscompressed){
		cout<<"Have not been compressed."<<endl;
		return ;
	}
	
	vector<vector<float> > temp(Row, vector<float>(Column));
	
	for(int i = 1;i < Matrix.size();i++){
		temp[Matrix[i][0]-1][Matrix[i][1]-1] = Matrix[i][2];
	}
	
	Matrix.clear();
	Matrix = temp; 	
}


int main(){
	vector<vector<float> > A = {{1,0,0,0,0,0},{0,0,0,0,0,2},{0,0,0,0,3,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0}};
	FullMatrix CoeMatrix(A);
	
	cout<<"Primal form:"<<endl;
	CoeMatrix.print();
	CoeMatrix.compress();
	cout<<"After compressing:"<<endl;
	CoeMatrix.print();
	CoeMatrix.full();
	cout<<"After restoring:"<<endl;
	CoeMatrix.print(); 
	
	
	return 0;
}
 

 运行结果:

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值