//RLSMatrix.cpp
#include"predefined.h"
#include"RLSMatrix.h"
Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q)
//算法5.3:求矩阵乘积Q=M*N,采用行逻辑链接存储表示
{
int arow,tp,p,brow,t,q,ccol,i,ctemp[10];
if(M.nu!=N.mu)
return ERROR;
(*Q).mu=M.mu;
(*Q).nu=N.nu;
(*Q).tu=0;
if(M.tu*N.tu!=0)
{
for(arow=1;arow<=M.mu;arow++)
{
for(i=1;i<N.nu+1;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;
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;
ctemp[ccol]+=M.data[p].e*N.data[q].e;
}
}
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;
}
Status CreateSMatrix(RLSMatrix *M)
//创建稀疏矩阵
{
int i,m,n,row,t;
int num[10];
ElemType e;
printf("请输入矩阵的行、列、非零元个数:");
scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);
for(i=1;i<=(*M).tu;i++)
{
printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,(*M).mu,(*M).nu);
scanf("%d,%d,%d",&m,&n,&e);
(*M).data[i].i=m;
(*M).data[i].j=n;
(*M).data[i].e=e;
}
for(row=1;row<=(*M).mu;row++)
num[row]=0;
for(t=1;t<=(*M).tu;t++)
++num[(*M).data[t].i];
(*M).rpos[1]=1;
for(row=2;row<=(*M).mu;row++)
(*M).rpos[row]=num[row-1]+(*M).rpos[row-1];
return OK;
}
void PrintSMatrix(RLSMatrix M)
//打印稀疏矩阵
{
int i;
printf("%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu);
printf("行 列 元素值\n");
for(i=1;i<=M.tu;i++)
printf("%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
//RLSMatrix.h
#define MAXSIZE 12500
#define MAXRC 20
typedef int ElemType;
typedef struct
{
int i,j;
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];//date[0]未用
int rpos[MAXRC+1];//各行第一个非零元的位置表
int mu,nu,tu;
}RLSMatrix;
Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);
Status CreateSMatrix(RLSMatrix *M);
void PrintSMatrix(RLSMatrix M);