本程序利用面向对象的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;
}
运行结果: