稀疏矩阵的压缩存储:
实现稀疏矩阵压缩存储,并实现矩阵转置和求和。
输入矩阵时,首先需要输入非零元素的个数,然后分别输入矩阵的 行号,列号和值。
输完2个矩阵后,自动进行计算第一个矩阵的转置以及两个矩阵的和。
例如:输入如下:
100 90 5 //矩阵的行数为100,列数为90,共5个非零元素。 1 10 100 //a(1,10)=100 50 60 200//a(50,60)=200 50 80 100//a(50,80)=100 60 60 200//a(60,60)=200 99 89 10//a(99,89)=10 100 90 4 //矩阵b的行数为100,列数为90,共4个非零元素。 1 1 10 //b(1,1)=10 50 60 -200//b(50,60)=-200 50 80 100 //b(50,80)=100 70 70 10 //b(70,70)=10
例如:
输入 | Result |
---|---|
100 90 5 1 10 100 50 60 200 50 80 100 60 60 200 99 89 10 100 90 4 1 1 10 50 60 -200 50 80 100 70 70 10 | The transformed matrix is: 10 1 100 60 50 200 60 60 200 80 50 100 89 99 10 The added matrix is: 1 1 10 1 10 100 50 80 200 60 60 200 70 70 10 99 89 10 |
答案 :
#include <iostream>
using namespace std;
struct Triple {
int Hang, Lie;
int data;
void operator = (Triple & R)
{
Hang = R.Hang; Lie = R.Lie; data = R.data;
}
};
class SparseMatrix {
private: //a = a*b
int Hangs, Lies, Terms;
Triple *smArray;
public:
SparseMatrix(int maxSize=100);
void Transpose(SparseMatrix& B);
SparseMatrix Add(SparseMatrix& b); //a = a+b
friend ostream& operator << (ostream& out, SparseMatrix &M);
friend istream& operator >> (istream& in, SparseMatrix &M);
};
SparseMatrix::SparseMatrix(int maxSize)
{
Terms = maxSize;
smArray = new Triple[maxSize];
Hangs = Lies = 0;
};
void SparseMatrix::Transpose(SparseMatrix & B)
{
int *hangSize = new int[Lies];
int *hangStart = new int[Lies];
B.Hangs = Lies; B.Lies = Hangs;
B.Terms = Terms;
if (Terms > 0) {
int i, j;
for (i = 0; i < Lies; i++) hangSize[i] = 0;
for (i = 0; i < Terms; i++)
hangSize[smArray[i].Lie]++;
hangStart[0] = 0;
for (i = 1; i < Lies; i++)
hangStart[i] = hangStart[i - 1] + hangSize[i - 1];
for (i = 0; i < Terms; i++) {
j = hangStart[smArray[i].Lie];
B.smArray[j].Hang = smArray[i].Lie;
B.smArray[j].Lie = smArray[i].Hang;
B.smArray[j].data = smArray[i].data;
hangStart[smArray[i].Lie]++;
}
}
delete[] hangSize; delete[] hangStart;
}
SparseMatrix SparseMatrix::Add(SparseMatrix & b)
{
SparseMatrix res;
int i = 0, j = 0, index_a, index_b;
res.Terms = 0;
while (i < Terms&&j < b.Terms) {
index_a = Lies * smArray[i].Hang + smArray[i].Lie;
index_b = Lies * b.smArray[j].Hang + b.smArray[j].Lie;
if (index_a < index_b) {
res.smArray[res.Terms] = smArray[i];
i++;
}
else if (index_a > index_b) {
res.smArray[res.Terms] = b.smArray[j];
j++;
}
else{
int vv= smArray[i].data + b.smArray[j].data;
if (vv != 0) {
res.smArray[res.Terms] = smArray[i];
res.smArray[res.Terms].data = vv;
}
if (vv == 0) {
res.Terms--;
}
i++; j++;
}
res.Terms++;
}
for (; i < Terms; i++) {
res.smArray[res.Terms] = smArray[i];
res.Terms++;
}
for (; j < b.Terms; j++) {
res.smArray[res.Terms] = b.smArray[j];
res.Terms++;
}
return res;
}
ostream & operator<<(ostream & out, SparseMatrix & M)
{
for (int i = 0; i < M.Terms; i++) {
out << M.smArray[i].Hang << " " << M.smArray[i].Lie << " " << M.smArray[i].data << endl;
}
return out;
}
istream & operator>>(istream & in, SparseMatrix & M)
{
in >> M.Hangs >> M.Lies >> M.Terms;
for (int i = 0; i < M.Terms; i++) {
in >> M.smArray[i].Hang >> M.smArray[i].Lie >> M.smArray[i].data;
}
return in;
}
int main()
{
SparseMatrix s,s2,s3,s4;
cin >> s;
cin >> s3;
s.Transpose(s2);
cout << "The transformed matrix is: " <<" "<<endl;
cout << s2;
s4=s.Add(s3);
cout << "The added matrix is:" << endl;
cout << s4;
return 0;
}