【问题】稀疏矩阵的加法,输入任意两个稀疏矩阵A和B,求出它们的和矩阵C。
【思路】 比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为零的元素的行号及列号(即i与j),将i与j都相等的AB中两个元素值相加,若相加结果不为零则保持i,j不变存储在新的三元组C中 ;若不等的话则按行递增的顺序分别储存在新的三元组中。最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。
5种情况:
A.data[m].row=B.data[n].row 且A.data[m].col=B.data[n].col
A.data[m].row=B.data[n].row 且A.data[m].col<B.data[n].col
A.data[m].row=B.data[n].row 且A.data[m].col>B.data[n].col
A.data[m].row<B.data[n].row
A.data[m].row>B.data[n].row
【提醒】在解决此问题前先弄清楚稀疏矩阵的存储有利于更好的解决问题。本文处理的是以按行递增方式储存的稀疏矩阵。
#include<iostream>
using namespace std;
const int MaxTerm = 100;
template<class DataType>
struct element
{
int row,col;
DataType item;
};
template<class DataType>
struct SparseMatrix
{
element<DataType> data[MaxTerm];
int mu,nu,tu; //行数列数与非零个数
};
bool MatAdd(SparseMatrix<int> Matrix_1, SparseMatrix<int> Matrix_2, SparseMatrix<int> &Matrix_tmp)
{
if(Matrix_1.mu != Matrix_2.mu || Matrix_1.nu != Matrix_2.nu)
return 0;
Matrix_tmp.mu = Matrix_1.mu;
Matrix_tmp.nu = Matrix_1.nu;
int i=0, j=0, k=0;
int v;
while(i<Matrix_1.tu && j<Matrix_2.tu)
{
if(Matrix_1.data[i].row == Matrix_2.data[j].row)
{
if(Matrix_1.data[i].col == Matrix_2.data[j].col)
{
Matrix_tmp.data[k].row = Matrix_1.data[i].row;
Matrix_tmp.data[k].col = Matrix_1.data[i].col;
v = Matrix_1.data[i].item + Matrix_2.data[j].item;
if(v != 0)
Matrix_tmp.data[k].item = v;
i++;j++;k++; //处理下一个元素
}
else if(Matrix_1.data[i].col < Matrix_2.data[j].col)
{
Matrix_tmp.data[k].row = Matrix_1.data[i].row;
Matrix_tmp.data[k].col = Matrix_1.data[i].col;
Matrix_tmp.data[k].item = Matrix_1.data[i].item;
i++;k++;
//Matrix_2还需进行下一轮比较(由稀疏矩阵的存储方式决的)
}
else if(Matrix_1.data[i].col > Matrix_2.data[j].col)
{
Matrix_tmp.data[k].row = Matrix_2.data[j].row;
Matrix_tmp.data[k].col = Matrix_2.data[j].col;
Matrix_tmp.data[k].item = Matrix_2.data[j].item;
j++;k++; //Matrix_1还需进行下一轮比较
}
}
else if(Matrix_1.data[i].row < Matrix_2.data[j].row)
{
Matrix_tmp.data[k].row = Matrix_1.data[i].row;
Matrix_tmp.data[k].col = Matrix_1.data[i].col;
Matrix_tmp.data[k].item = Matrix_1.data[i].item;
i++;k++;
}
else
{
Matrix_tmp.data[k].row = Matrix_2.data[j].row;
Matrix_tmp.data[k].col = Matrix_2.data[j].col;
Matrix_tmp.data[k].item = Matrix_2.data[j].item;
j++;k++;
}
}
Matrix_tmp.tu = k;
return true;
}
SparseMatrix<int> CreatMat()
{
SparseMatrix<int> Matrix;
int m,n,t;
cout << "请输入矩阵行数列数以及非零元个数: ";
cin >> m >> n >> t;
Matrix.mu = m;
Matrix.nu = n;
Matrix.tu = t;
for(int i=0; i<Matrix.tu; i++)
{
int row,col,item;
cout << "输入矩阵元素所在的行、列以及它的值: ";
cin >> row >> col >> item;
Matrix.data[i].row = row;
Matrix.data[i].col = col;
Matrix.data[i].item = item;
}
return Matrix;
}
void Printf(SparseMatrix<int> T)
{
for(int i=0; i<T.tu; i++)
{
cout << " row: " << T.data[i].row << " "
<< " col: " << T.data[i].col << " "
<< " item: " << T.data[i].item << endl;
}
}
int main()
{
SparseMatrix<int> Mat1,Mat2,Mat3;
Mat1 = CreatMat();
Mat2 = CreatMat();
cout << "Mat1: " << endl;
Printf(Mat1);
cout << "Mat2: " << endl;
Printf(Mat2);
if(MatAdd(Mat1,Mat2,Mat3))
{
cout << "Mat1 + Mat2: " << endl;
Printf(Mat3);
}
else
{
cout << "相加失败。" << endl;
}
return 0;
}
若有考虑不周之处,还望指正。