题目
有两个稀疏矩阵A,B,规格分别是m * n,n * k;现在要求编写一个函数,来计算C=A * B,并且A,B.C矩阵皆由三元组储存。
#函数程序段
//先将两个三元组转换成矩阵,然后计算两个矩阵的乘积,然后再转化成三元组
void trimatmultiply(int A[][3], int B[][3], int C[][3],int m, int n, int k)
{
int Ak=A[0][0],Bk=B[0][0];
int Amat[m][n],Bmat[n][k],Cmat[m][k];
int flag=0;
for(int i=0;i<m;++i)//A矩阵复原
{
for(int j=0;j<n;++j)
{
for(flag=1;flag<=Ak;++flag)
{
if(i==A[flag][1] && j==A[flag][2])
{
Amat[i][j]=A[flag][0];
break;
}
}
if(flag>Ak)
{
Amat[i][j]=0;
}
}
}
for(int i=0;i<n;++i)//B矩阵复原
{
for(int j=0;j<k;++j)
{
for(flag=1;flag<=Bk;++flag)
{
if(i==B[flag][1] && j==B[flag][2])
{
Bmat[i][j]=B[flag][0];
break;
}
}
if(flag>Bk)
{
Bmat[i][j]=0;
}
}
}
//初始化C矩阵
for(int i=0;i<m;++i)
{
for(int j=0;j<k;++j)
{
Cmat[i][j]=0;
}
}
//求C矩阵,m行k列
for(int i=0;i<m;++i)
{
for(int j=0;j<k;++j)
{
for(int q=0;q<n;++q)//Amat是列变化,Bmat是行变化;Amat决定行数,Bmat决定列数
{
Cmat[i][j]+=Amat[i][q]*Bmat[q][j];
}
}
}
//把C矩阵转化为三元组
int count=0;//记录C矩阵中非零元素
for(int i=0;i<m;++i)
{
for(int j=0;j<k;++j)
{
if(Cmat[i][j]!=0)
{
++count;
C[count][0]=Cmat[i][j];
C[count][1]=i;
C[count][2]=j;
}
}
}
C[0][0]=count;
C[0][1]=m;
C[0][2]=k;
}
#完整测试程序段
#include<iostream>
#define maxSize 3
using namespace std;
//建立三元组存储稀疏矩阵(int型)
void createtrimat(int A[][maxSize], int m, int n, int B[][3])
{
int k=0;
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
if(A[i][j]!=0)
{
++k;
B[k][0]=A[i][j];
B[k][1]=i;
B[k][2]=j;
}
}
B[0][0]=k;
B[0][1]=m;
B[0][2]=n;
}
}
//先将两个三元组转换成矩阵,然后计算两个矩阵的乘积,然后再转化成三元组
void trimatmultiply(int A[][3], int B[][3], int C[][3],int m, int n, int k)
{
int Ak=A[0][0],Bk=B[0][0];
int Amat[m][n],Bmat[n][k],Cmat[m][k];
int flag=0;
for(int i=0;i<m;++i)//A矩阵复原
{
for(int j=0;j<n;++j)
{
for(flag=1;flag<=Ak;++flag)
{
if(i==A[flag][1] && j==A[flag][2])
{
Amat[i][j]=A[flag][0];
break;
}
}
if(flag>Ak)
{
Amat[i][j]=0;
}
}
}
for(int i=0;i<n;++i)//B矩阵复原
{
for(int j=0;j<k;++j)
{
for(flag=1;flag<=Bk;++flag)
{
if(i==B[flag][1] && j==B[flag][2])
{
Bmat[i][j]=B[flag][0];
break;
}
}
if(flag>Bk)
{
Bmat[i][j]=0;
}
}
}
//初始化C矩阵
for(int i=0;i<m;++i)
{
for(int j=0;j<k;++j)
{
Cmat[i][j]=0;
}
}
//求C矩阵,m行k列
for(int i=0;i<m;++i)
{
for(int j=0;j<k;++j)
{
for(int q=0;q<n;++q)//Amat是列变化,Bmat是行变化;Amat决定行数,Bmat决定列数
{
Cmat[i][j]+=Amat[i][q]*Bmat[q][j];
}
}
}
//把C矩阵转化为三元组
int count=0;//记录C矩阵中非零元素
for(int i=0;i<m;++i)
{
for(int j=0;j<k;++j)
{
if(Cmat[i][j]!=0)
{
++count;
C[count][0]=Cmat[i][j];
C[count][1]=i;
C[count][2]=j;
}
}
}
C[0][0]=count;
C[0][1]=m;
C[0][2]=k;
}
int main()
{
int Amat[][3]={{0,1,0},{2,0,0},{0,0,3}},Bmat[][3]={{1,0,0},{0,0,2},{0,4,0}};
int A[100][3],B[100][3],C[100][3];
createtrimat(Amat,3,3,A);
createtrimat(Bmat,3,3,B);
trimatmultiply(A,B,C,3,3,3);
for(int i=0;i<4;++i)
{
for(int j=0;j<3;++j)
{
cout<<C[i][j]<<" ";
}
cout<<endl;
}
}