作者在 2008-06-07 09:23:26 发布以下内容
#include<stdio.h>
#define MAX 40 /*非零元个数的最大值*/
#define MAX 40 /*非零元个数的最大值*/
typedef struct
{
int i,j;/*非零元的行下标和列下标*/
int e;/*该非零元的数值*/
}Triple;
{
int i,j;/*非零元的行下标和列下标*/
int e;/*该非零元的数值*/
}Triple;
typedef struct
{
Triple data[MAX+1];/*非零元三元组表,data[0]未用*/
int mu,nu,tu;/*矩阵的行数,列数,非零元的个数*/
int rpos[MAX+1];/*各行第一个非零元的位置表*/
}Matrix;
{
Triple data[MAX+1];/*非零元三元组表,data[0]未用*/
int mu,nu,tu;/*矩阵的行数,列数,非零元的个数*/
int rpos[MAX+1];/*各行第一个非零元的位置表*/
}Matrix;
/*稀疏矩阵的初始化函数*/
void InitMatrix(Matrix *W)
{ int i,p,num[MAX],rpos[MAX],r;
printf("please input the number of row,col and fei ling yuan:\n");/*输入矩阵的行数,列数非零元的个数*/
scanf("%d,%d,%d",&W->mu,&W->nu,&W->tu);
printf("please input the data:\n");
for(i=1;i<=W->tu;i++)/*输入矩阵的行号,列号和非零元的数值*/
scanf("%d,%d,%d",&W->data[i].i,&W->data[i].j,&W->data[i].e);
/*求矩阵W各行第一个非零元在W.data中的位置*/
for(r=1;r<=W->mu;r++)
num[r]=0;/*初始化W每一行的非零元的个数为0*/
for(p=1;p<=W->tu;p++)
num[W->data[p].i]=num[W->data[p].i]+1;
W->rpos[1]=1;
for(r=2;r<=W->mu+1;r++)
W->rpos[r]=W->rpos[r-1]+num[r-1];
}
/*将A转置为B的函数*/
void fasttrans(Matrix A,Matrix *B)
{
int col,cpot[MAX],num[MAX],t,p,q;
/*初始化矩阵B*/
(*B).mu=A.nu;
(*B).nu=A.mu;
(*B).tu=A.tu;
if(B->tu)
{
for(col=0;col<A.nu;++col)
num[col]=0;/*初始化每一列非零元的个数*/
for(t=1;t<=A.tu;++t)
++num[A.data[t].j];/*计算每一列非零元的个数*/
cpot[1]=1;
for(col=2;col<=A.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];/*计算矩阵A每一列第一个非零元在B.data中的位置*/
/*实现对A中的每一个非零元进行转置*/
for(p=1;p<=A.tu;++p)
{
col=A.data[p].j;
q=cpot[col];
(*B).data[q].i=A.data[p].j;
(*B).data[q].j=A.data[p].i;
(*B).data[q].e=A.data[p].e;
++cpot[col];
}
}
}
void InitMatrix(Matrix *W)
{ int i,p,num[MAX],rpos[MAX],r;
printf("please input the number of row,col and fei ling yuan:\n");/*输入矩阵的行数,列数非零元的个数*/
scanf("%d,%d,%d",&W->mu,&W->nu,&W->tu);
printf("please input the data:\n");
for(i=1;i<=W->tu;i++)/*输入矩阵的行号,列号和非零元的数值*/
scanf("%d,%d,%d",&W->data[i].i,&W->data[i].j,&W->data[i].e);
/*求矩阵W各行第一个非零元在W.data中的位置*/
for(r=1;r<=W->mu;r++)
num[r]=0;/*初始化W每一行的非零元的个数为0*/
for(p=1;p<=W->tu;p++)
num[W->data[p].i]=num[W->data[p].i]+1;
W->rpos[1]=1;
for(r=2;r<=W->mu+1;r++)
W->rpos[r]=W->rpos[r-1]+num[r-1];
}
/*将A转置为B的函数*/
void fasttrans(Matrix A,Matrix *B)
{
int col,cpot[MAX],num[MAX],t,p,q;
/*初始化矩阵B*/
(*B).mu=A.nu;
(*B).nu=A.mu;
(*B).tu=A.tu;
if(B->tu)
{
for(col=0;col<A.nu;++col)
num[col]=0;/*初始化每一列非零元的个数*/
for(t=1;t<=A.tu;++t)
++num[A.data[t].j];/*计算每一列非零元的个数*/
cpot[1]=1;
for(col=2;col<=A.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];/*计算矩阵A每一列第一个非零元在B.data中的位置*/
/*实现对A中的每一个非零元进行转置*/
for(p=1;p<=A.tu;++p)
{
col=A.data[p].j;
q=cpot[col];
(*B).data[q].i=A.data[p].j;
(*B).data[q].j=A.data[p].i;
(*B).data[q].e=A.data[p].e;
++cpot[col];
}
}
}
/*用三元组表示的稀疏矩阵M和N相乘的函数*/
void MulMatrix(Matrix M,Matrix N,Matrix *Q)
{
int t,p,q,tp,k,arow,brow,ccol,ctemp[MAX],num[MAX];
if(M.nu!=N.mu) printf("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)
{
for(k=1;k<=M.mu;k++)
ctemp[k]=0;/*将累加器清零*/
Q->rpos[arow]=Q->tu+1;
if(arow<M.mu) tp=M.rpos[arow+1];
else {tp=M.tu+1;}
/*对当前行中每一个非零元找到对应元在N中的位置*/
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;/*乘积元在Q中的列号*/
ctemp[ccol]+=M.data[p].e*N.data[q].e;
}
}/*求得Q中第arow行的非零元*/
for(ccol=1;ccol<=Q->nu;++ccol)
if(ctemp[ccol])
{ /*压缩存储该行的非零元*/
if(++Q->tu>MAX) printf("error");/*若Q中的非零元的个数超出最大范围输出错误的信息*/
Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol];
}
}
}
/*求出Q中每一行非零元在Q.data中的位置*/
for(t=1;t<=(*Q).tu;t++)
++num[(*Q).data[t].i];
(*Q).rpos[1]=1;
for(t=2;t<=(*Q).mu;t++)
(*Q).rpos[t]=(*Q).rpos[t-1]+num[t-1];
}
void MulMatrix(Matrix M,Matrix N,Matrix *Q)
{
int t,p,q,tp,k,arow,brow,ccol,ctemp[MAX],num[MAX];
if(M.nu!=N.mu) printf("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)
{
for(k=1;k<=M.mu;k++)
ctemp[k]=0;/*将累加器清零*/
Q->rpos[arow]=Q->tu+1;
if(arow<M.mu) tp=M.rpos[arow+1];
else {tp=M.tu+1;}
/*对当前行中每一个非零元找到对应元在N中的位置*/
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;/*乘积元在Q中的列号*/
ctemp[ccol]+=M.data[p].e*N.data[q].e;
}
}/*求得Q中第arow行的非零元*/
for(ccol=1;ccol<=Q->nu;++ccol)
if(ctemp[ccol])
{ /*压缩存储该行的非零元*/
if(++Q->tu>MAX) printf("error");/*若Q中的非零元的个数超出最大范围输出错误的信息*/
Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol];
}
}
}
/*求出Q中每一行非零元在Q.data中的位置*/
for(t=1;t<=(*Q).tu;t++)
++num[(*Q).data[t].i];
(*Q).rpos[1]=1;
for(t=2;t<=(*Q).mu;t++)
(*Q).rpos[t]=(*Q).rpos[t-1]+num[t-1];
}
/* 矩阵的输出函数*/
void output(Matrix *P)
{ int i,j,t,k=0;
t=1;
printf(" the array is: \n");
for(i=1;i<=P->mu;i++)
{for(j=1;j<=P->nu;j++)
{ if(P->data[t].i==i&&P->data[t].j==j)
{ printf("%4d",P->data[t].e);t++;}
else printf("%4d",k);
}
printf("\n");
}
}
void output(Matrix *P)
{ int i,j,t,k=0;
t=1;
printf(" the array is: \n");
for(i=1;i<=P->mu;i++)
{for(j=1;j<=P->nu;j++)
{ if(P->data[t].i==i&&P->data[t].j==j)
{ printf("%4d",P->data[t].e);t++;}
else printf("%4d",k);
}
printf("\n");
}
}
void main( )
{ int i;
Matrix A,B,C;/*定义Matrix类型的三个矩阵A,B,C*/
/*使用说明*/
printf("1 mult array,A*B=C\n");
printf("2 transpose array,A->B\n");
printf("3 exit\n");
while(1)
{ printf("please select item to operarting:");
scanf("%d",&i);
switch(i)/*用switch语句实现各种功能的转换*/
{ case 1: InitMatrix(&A);output(&A);InitMatrix(&B);output(&B);MulMatrix(A,B,&C);output(&C);break;
case 2: InitMatrix(&A);output(&A);fasttrans(A,&B);output(&B);break;
case 3: exit(0); break;
}
}
}
{ int i;
Matrix A,B,C;/*定义Matrix类型的三个矩阵A,B,C*/
/*使用说明*/
printf("1 mult array,A*B=C\n");
printf("2 transpose array,A->B\n");
printf("3 exit\n");
while(1)
{ printf("please select item to operarting:");
scanf("%d",&i);
switch(i)/*用switch语句实现各种功能的转换*/
{ case 1: InitMatrix(&A);output(&A);InitMatrix(&B);output(&B);MulMatrix(A,B,&C);output(&C);break;
case 2: InitMatrix(&A);output(&A);fasttrans(A,&B);output(&B);break;
case 3: exit(0); break;
}
}
}