主题:关于稀疏矩阵乘法
运行不出结果。。。。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
//三元组结构
typedef struct
{
int r,c; //矩阵行下标和列下标
int v; //值
}Triple;
//矩阵结构
typedef struct
{
Triple data[MAXSIZE];
int num[MAXSIZE];//存放各行非零元个数
int rops[MAXSIZE+1]; //存放各行第一个非零元在矩阵中的位置
int mu,nu,tu; //矩阵的行数、列数、非零元个数
}matrix;
//输入矩阵
void Init(matrix *M)
{
int i;
int u,v;
int p[8][8];
if(M->mu<1||M->nu<1||M->tu>M->mu*M->nu)
{
printf("出错\n");
}
for(u=1;u<=M->mu;u++)
for(v=1;v<=M->nu;v++)
p[u][v]=0;
for(i=1;i<=M->tu;i++)
{
printf("第%d个非零元的行号:",i);
scanf("%d",&M->data[i].r);
printf("\n");
printf("第%d个非零元得列号:",i);
scanf("%d",&M->data[i].c);
printf("\n");
printf("第个非零元的值:",i);
scanf("%d",&M->data[i].v);
p[M->data[i].r][M->data[i].c]=M->data[i].v;
}
printf("\n");
printf("您创建的矩阵如下:\n");
for(u=1;u<=M->mu;u++)
{for(v=1;v<=M->nu;v++)
{ printf("%d ",p[u][v]);}
printf("\n");
}
}
int Cheng(matrix *M,matrix *T,matrix *G)
{ int u,v,w,k;
int p1[MAXSIZE+1][MAXSIZE+1];
for(u=1;u<=M->mu;u++)
{for(v=1;v<=M->nu;v++)
p1[u][v]=0;
}
if (M->nu!= T->mu)
{
printf("不能相乘\n");
return 1;
}
//Q的初始化
G->mu=M->mu;
G->nu=T->nu;
G->tu=0;
int mrow, nrow, p, q, t, tp, qcol;
int ctemp[MAXSIZE+1];
for(mrow=1;mrow<M->mu;mrow++) //清零
{
M->num[mrow]=0;
}
for(w=1;w<=M->tu;w++) //M中的非零个数
{
k=M->data[w].r;
M->num[k]++;
}
M->rops[1]=1; //第一行第一个非零元的位置在data[]的第一位
for(mrow=2;mrow<=M->mu;mrow)
{
M->rops[mrow]=M->rops[mrow-1]+M->num[mrow-1];
}
//记录矩阵T中各行非零元的个数
for(nrow=1;nrow<T->mu;nrow++) //清零
{
T->num[nrow]=0;
}
for(w=1;w<=T->tu;w++) //T中的非零个数
{
k=T->data[w].r;
T->num[k]++;
}
T->rops[1]=1; //第一行第一个非零元的位置在data的第一位
for(nrow=2;nrow<=T->mu;nrow++)
{
T->rops[nrow]=T->rops[nrow-1]+T->num[nrow-1];
}
//辅助数组
//如果Q是非零矩阵
if (M->tu*T->tu!=0)
{
for (mrow=1; mrow<= M->mu;++mrow)
{
//当前行各元素累加器清零
for(int x=1;x<=T->nu;x++)
{ctemp[x];}
//end_x
//当前行的首个非零元素在三元组中的位置为此行前所有非0元素加1
G->rops[mrow]=G->tu+1;
if (mrow<M->mu)
{
tp=M->rops[mrow+1];
}
else
tp=M->tu+1;
for (p=M->rops[mrow]; p<tp;++p) //对当前行的每个非零元素操作
{
nrow=M->data[p].c; //在N中找到与M操作元素的c值相等的行值r
if (nrow<T->mu)
{
t = T->rops[nrow+1];
}
else
t = T->tu+1;
//对找出的行的每个非零元素进行操作
for (q = T->rops[nrow];q<t;++q)
{
qcol = T->data[q].c;
//将乘得到的对应值放在相应元素的累加器里面
ctemp[qcol] += M->data[p].v*T->data[q].v;
}
}//p_end_for
//对已经求出的累加器中的值压缩到Q中
for (qcol=1;qcol<=T->nu;qcol++)
{
if (++T->tu>MAXSIZE)
{
printf("错误\n");
return 1;
}
if (ctemp[qcol])
{
G->data[G->tu].r = mrow;
G->data[G->tu].c = qcol;
p1[G->data[G->tu].r][G->data[G->tu].c] = ctemp[qcol];
}
}//qcol_end_for
}//arow_end_for
}//end_if
printf("两矩阵相乘的结果为:\n");
for(u=1;u<=M->mu;u++)
{ for(v=1;v<=M->nu;v++)
{printf("%d ",p1[u][v]);}
printf("\n");
}
return 0;
}
int main()
{
matrix *M=(matrix*)malloc(sizeof(matrix));
matrix *T=(matrix*)malloc(sizeof(matrix));
matrix *G=(matrix*)malloc(sizeof(matrix));
int tag=1;
int n;
printf("请输入第一个矩阵的行数和列数及非零元的个数:");
scanf("%d%d%d",&(M->mu),(&M->nu),(&M->tu));
Init(M);
printf("\n");
printf("请输入第一个矩阵的行数和列数及非零元的个数:");
scanf("%d%d%d",&(T->mu),(&T->nu),(&T->tu));
Init(T);
printf("\n");
while(tag)
{
printf("请输入相乘(3)、退出(4)");
printf("\n");
scanf("%d",&n);
switch(n)
{
case 3:Cheng(M,T,G);break;
case 4:tag=0;
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
//三元组结构
typedef struct
{
int r,c; //矩阵行下标和列下标
int v; //值
}Triple;
//矩阵结构
typedef struct
{
Triple data[MAXSIZE];
int num[MAXSIZE];//存放各行非零元个数
int rops[MAXSIZE+1]; //存放各行第一个非零元在矩阵中的位置
int mu,nu,tu; //矩阵的行数、列数、非零元个数
}matrix;
//输入矩阵
void Init(matrix *M)
{
int i;
int u,v;
int p[8][8];
if(M->mu<1||M->nu<1||M->tu>M->mu*M->nu)
{
printf("出错\n");
}
for(u=1;u<=M->mu;u++)
for(v=1;v<=M->nu;v++)
p[u][v]=0;
for(i=1;i<=M->tu;i++)
{
printf("第%d个非零元的行号:",i);
scanf("%d",&M->data[i].r);
printf("\n");
printf("第%d个非零元得列号:",i);
scanf("%d",&M->data[i].c);
printf("\n");
printf("第个非零元的值:",i);
scanf("%d",&M->data[i].v);
p[M->data[i].r][M->data[i].c]=M->data[i].v;
}
printf("\n");
printf("您创建的矩阵如下:\n");
for(u=1;u<=M->mu;u++)
{for(v=1;v<=M->nu;v++)
{ printf("%d ",p[u][v]);}
printf("\n");
}
}
int Cheng(matrix *M,matrix *T,matrix *G)
{ int u,v,w,k;
int p1[MAXSIZE+1][MAXSIZE+1];
for(u=1;u<=M->mu;u++)
{for(v=1;v<=M->nu;v++)
p1[u][v]=0;
}
if (M->nu!= T->mu)
{
printf("不能相乘\n");
return 1;
}
//Q的初始化
G->mu=M->mu;
G->nu=T->nu;
G->tu=0;
int mrow, nrow, p, q, t, tp, qcol;
int ctemp[MAXSIZE+1];
for(mrow=1;mrow<M->mu;mrow++) //清零
{
M->num[mrow]=0;
}
for(w=1;w<=M->tu;w++) //M中的非零个数
{
k=M->data[w].r;
M->num[k]++;
}
M->rops[1]=1; //第一行第一个非零元的位置在data[]的第一位
for(mrow=2;mrow<=M->mu;mrow)
{
M->rops[mrow]=M->rops[mrow-1]+M->num[mrow-1];
}
//记录矩阵T中各行非零元的个数
for(nrow=1;nrow<T->mu;nrow++) //清零
{
T->num[nrow]=0;
}
for(w=1;w<=T->tu;w++) //T中的非零个数
{
k=T->data[w].r;
T->num[k]++;
}
T->rops[1]=1; //第一行第一个非零元的位置在data的第一位
for(nrow=2;nrow<=T->mu;nrow++)
{
T->rops[nrow]=T->rops[nrow-1]+T->num[nrow-1];
}
//辅助数组
//如果Q是非零矩阵
if (M->tu*T->tu!=0)
{
for (mrow=1; mrow<= M->mu;++mrow)
{
//当前行各元素累加器清零
for(int x=1;x<=T->nu;x++)
{ctemp[x];}
//end_x
//当前行的首个非零元素在三元组中的位置为此行前所有非0元素加1
G->rops[mrow]=G->tu+1;
if (mrow<M->mu)
{
tp=M->rops[mrow+1];
}
else
tp=M->tu+1;
for (p=M->rops[mrow]; p<tp;++p) //对当前行的每个非零元素操作
{
nrow=M->data[p].c; //在N中找到与M操作元素的c值相等的行值r
if (nrow<T->mu)
{
t = T->rops[nrow+1];
}
else
t = T->tu+1;
//对找出的行的每个非零元素进行操作
for (q = T->rops[nrow];q<t;++q)
{
qcol = T->data[q].c;
//将乘得到的对应值放在相应元素的累加器里面
ctemp[qcol] += M->data[p].v*T->data[q].v;
}
}//p_end_for
//对已经求出的累加器中的值压缩到Q中
for (qcol=1;qcol<=T->nu;qcol++)
{
if (++T->tu>MAXSIZE)
{
printf("错误\n");
return 1;
}
if (ctemp[qcol])
{
G->data[G->tu].r = mrow;
G->data[G->tu].c = qcol;
p1[G->data[G->tu].r][G->data[G->tu].c] = ctemp[qcol];
}
}//qcol_end_for
}//arow_end_for
}//end_if
printf("两矩阵相乘的结果为:\n");
for(u=1;u<=M->mu;u++)
{ for(v=1;v<=M->nu;v++)
{printf("%d ",p1[u][v]);}
printf("\n");
}
return 0;
}
int main()
{
matrix *M=(matrix*)malloc(sizeof(matrix));
matrix *T=(matrix*)malloc(sizeof(matrix));
matrix *G=(matrix*)malloc(sizeof(matrix));
int tag=1;
int n;
printf("请输入第一个矩阵的行数和列数及非零元的个数:");
scanf("%d%d%d",&(M->mu),(&M->nu),(&M->tu));
Init(M);
printf("\n");
printf("请输入第一个矩阵的行数和列数及非零元的个数:");
scanf("%d%d%d",&(T->mu),(&T->nu),(&T->tu));
Init(T);
printf("\n");
while(tag)
{
printf("请输入相乘(3)、退出(4)");
printf("\n");
scanf("%d",&n);
switch(n)
{
case 3:Cheng(M,T,G);break;
case 4:tag=0;
}
}
return 0;
}