65,210
社区成员
发帖
与我相关
我的任务
分享
//函数结果状态码
#define OK 1
#define ERROR 0
#define OVERFLOW -1
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
// ----- 稀疏矩阵的三元组顺序表存储表示 -----
#define MAXSIZE 100 //假设非零元个数的最大值为100
#define MAXRC 100
typedef struct {
int i,j; //非零元的行下标和列下标
int e; //非零元的值
}Triple;
typedef struct {
Triple data[MAXSIZE + 1]; //非零元三元组表,data[0]未用
int rpos[MAXRC + 1]; //各行的第一个非零元的位置表
int mu, nu, tu; //矩阵的行数、列数和非零元个数
}RLSMatrix;
Status CreateSMatrix(RLSMatrix *M); //创建稀疏矩阵M,采用三元组存储
Status PrintSMatrix(RLSMatrix M); //输出稀疏矩阵M
Status AddSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix *Q); //求稀疏矩阵的和Q = M + N
Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix *Q); //求稀疏矩阵乘积Q = M ×N
//求稀疏矩阵乘积Q = M ×N
Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix *Q)
{
int arow, brow, ccol, i, t, *ctemp, p, q, tp;//中间变量
ctemp = (int *) malloc(sizeof(int)* (N.nu+1));
//检查稀疏矩阵M的列数和N的行数是否对应相等
if(M.nu != N.mu) return ERROR;//稀疏矩阵M的列数和N的行数不相等,不能相乘,退出
//初始化矩阵Q
Q->mu = M.mu, Q->nu = N.nu, Q->tu = 0;
//相乘
if(M.tu * N.tu != 0)//Q是非零矩阵
{
for(arow = 1; arow <= M.mu; ++arow)//处理M的每一行
{
for(i = 0; i <= N.nu; ++i) ctemp[i] = 0;//当前行各元素累加器清零
Q->rpos[arow] = Q->tu + 1;
if(arow < M.mu) tp = M.rpos[arow + 1];
else tp = M.tu +1;
for(p = M.rpos[arow]; p < tp; ++p)//对当前行中的每一个非零元
{
brow = M.data[p].j; //找到对应元在N中的行号
if(brow < N.mu) t = N.rpos[brow+1];
else t = N.tu + 1;
for(q = N.rpos[brow]; q < t; ++q)
{
ccol = N.data[q].j; //乘积元素在Q中列号
ctemp[ccol] += M.data[p].e * N.data[q].e;
}
}//求得Q中第crow( = arow)行的非零元
for(ccol = 1; ccol <= Q->nu; ++ccol) //压缩存储该行非零元
{
if(ctemp[ccol])//非零元
{
if(++(Q->tu) > MAXSIZE) return ERROR;
Q->data[Q->tu].i = arow, Q->data[Q->tu].j = ccol, Q->data[Q->tu].e = ctemp[ccol];
}
}
}
}
return OK;
}