define SMAX 1024 /*一个足够大的数*/ |
typedef struct |
{ |
int i,j; /*非零元素的行、列*/ |
datatype v; /*非零元素值*/ |
} SPNode; /*三元组类型*/ |
typedef struct |
{ |
int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/ |
SPNode data[SMAX]; /*三元组表*/ |
} SPMatrix; /*三元组表的存储类型*/ |
SPMatrix *MulSMatrix ( SPMatrix *A, SPMatrix *B ) |
/*稀疏矩阵A(m1× n1)和B(m2× n2) 用三元组表存储,求A×B */ |
{ |
SPMatrix *C; /* 乘积矩阵的指针*/ |
int p,q,i,j,k,r; |
datatype temp[n+1]; |
int num[B->nu+1],rpot[B->nu+1]; |
if ( A->nu!=B->mu ) return NULL; /*A 的列与B 的行不相等*/ |
C= malloc ( sizeof ( SPMatrix ) ); /*申请C 矩阵的存储空间*/ |
C->mu=A->mu; |
C->nu=B->nu; |
if ( A->tu*B->tu==0 ) {C->tu=0; return C; } |
for ( i=1; i<= B->mu; i++ ) num[i]=0; /*求矩阵B 中每一行非零元素的个数*/ |
for ( k=1; k<=B->tu; k++ ) |
{ |
i= B->data[k].i; |
num[i]++; |
} |
rpot[1]=1; /*求矩阵B 中每一行第一个非零元素在B.data 中的位置*/ |
for ( i=2; i<=B->mu; i++ ) |
rpot[i]= rpot[i-1]+num[i-1]; |
r=0; /*当前C 中非零元素的个数*/ |
p=1; /*指示A.data 中当前非零元素的位置*/ |
for ( i= 1; i<=A->mu; i++ ) |
{ |
for ( j=1; j<=B->nu; j++ ) temp[j]=0; /*cij 的累加器初始化*/ |
while ( A->data[p].i==i ) . /*求第i 行的*/ |
{ k=A->data[p].j; /*A 中当前非零元的列号*/ |
if ( k<B->mu ) t=rpot[k+1]; |
else t=B->tu+1; /*确定B 中第k 行的非零元素在B.data 中的下限位置*/ |
for ( q=rpot[k]; q<t; q++; ) /* B 中第k 行的每一个非零元素*/ |
{ |
j=B->data[q].j; |
temp[j]+=A->data[p].v * B->data[q].v |
} |
p++; |
} /* while */ |
for ( j=1; j<=B->nu; j++ ) |
if ( temp[j] ) |
{ |
r++;; |
C->data[r]={i,j,temp[j] }; |
} |
} /*for i*/ |
C->tu=r; |
return C; |
} /* MulSMatrix */ |