主题:怎么样用三元组表实现两个稀疏矩阵的加法
lujiayang
[专家分:0] 发布于 2006-04-03 21:49:00
帮帮忙!!谢谢
回复列表 (共8个回复)
沙发
aigle [专家分:0] 发布于 2006-04-03 22:09:00
将i,j相等项的值相加即可,在重建一个三元组表,i,j不变,值为两者之和,代码就留给你自己实现了。
板凳
lujiayang [专家分:0] 发布于 2006-04-03 22:13:00
我要的就是代码
那个思路我也知道
3 楼
lujiayang [专家分:0] 发布于 2006-04-03 23:00:00
#define MAXSIZE 500
typedef struct
{
int i,j;
int e;
}TRIPLE;
typedef struct
{
TRIPLE data[MAXSIZE+1];
int mu,nu,tu;
}TSMATRIX;
void TSMatrix_Add(TSMatrix A,TSMatrix B,TSMatrix &C)
{
C.mu=A.mu;C.nu=A.nu;C.tu=0;
pa=1;pb=1;pc=1;
for(x=1;x<=A.mu;x++)
{
while(A.data[pa].i<x) pa++;
while(B.data[pb].i<x) pb++;
while(A.data[pa].i==x&&B.data[pb].i==x)
{
if(A.data[pa].j==B.data[pb].j)
{
ce=A.data[pa].e+B.data[pb].e;
if(ce)
{
C.data[pc].i=x;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=ce;
pa++;pb++;pc++;
}
}
else if(A.data[pa].j>B.data[pb].j)
{
C.data[pc].i=x;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
else
{
C.data[pc].i=x;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e
C.data[pc].e=A.data[pa].e
pa++;pc++;
}
}
while(A.data[pa]==x)
{
C.data[pc].i=x;
C.data[pc].j=A.data[pa].j;
C.data[pc].e=A.data[pa].e
pa++;pc++;
}
while(B.data[pb]==x)
{
C.data[pc].i=x;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
}
C.tu=pc;
}
4 楼
lujiayang [专家分:0] 发布于 2006-04-03 23:01:00
请问一下 主函数怎么写啊
才能在tc中运行
5 楼
lujiayang [专家分:0] 发布于 2006-04-04 12:36:00
自己顶一下
没有人知道吗
6 楼
liwota [专家分:0] 发布于 2006-06-27 01:32:00
这个我也会啊
我也试过了
好像不行耶
有没有人试过啊?
我好久没编过程序
真烦啊
有人能早点回啊
7 楼
summerC [专家分:30] 发布于 2006-06-28 18:09:00
#include "Stdio.h"
#include "Conio.h"
# define MAXSIZE 10 /*假设非零元个数的最大值为10*/
# define MAXRC 10
struct Triple
{
int i,j; /*该非零元的行下标和列下标*/
int e;
};
struct TSMtrix
{
struct Triple data[MAXSIZE+1]; /*非零元三元组表,data[0]未用*/
int rpos[MAXRC+1]; /*各行第一个非零元的位置表*/
int cpos[MAXRC+1]; /*各列第一个非零元的位置表*/
int num[MAXRC+1]; /*各列非零元的个数*/
int mu,nu,tu; /*矩阵的行数、列数和非零元个数*/
};
CreateMtrix(struct TSMtrix *M)
{ /*创建一个稀疏矩阵*/
int i,elem,col,row,mu,nu,tu;
printf("please input matrix col,row,unzeroed numbers:\n");
scanf("%d%d%d",&mu,&nu,&tu);
M->mu=mu;
M->nu=nu;
M->tu=tu;
for (i=1;i<=tu;i++)
{
printf("please input element col,row,value:\n");
scanf("%d%d%d",&col,&row,&elem);
if ( mu<0 || nu<0 || mu>M->mu || nu>M->nu)
{
printf("error!");
i--;
}
else
{
M->data[i].i=col;
M->data[i].j=row;
M->data[i].e=elem;
}
}
}
ShowMtrix(struct TSMtrix M)
{ /*打印出矩阵*/
int i=1,j=1,dir=1;
printf("The matrix is:\n");
for (i=1;i<=M.mu;i++)
{
for (j=1;j<=M.nu;j++)
{
if (M.data[dir].i==i && M.data[dir].j==j) /*存在非零元*/
{
printf("%d ",M.data[dir].e);
dir++;
}
else
printf("0 ");
}
printf("\n");
}
}
FastTransposeSMtrix(struct TSMtrix M,struct TSMtrix *T)
{ /*矩阵的快速转置*/
int t=1,p=1,q,col=M.nu;
T->mu=M.mu;
T->nu=M.nu;
T->tu=M.tu;
if (T->tu)
{
for (col=1;col<=M.nu;col++)
M.num[col]=0;
for (t=1;t<=M.nu;t++)
++M.num[M.data[t].j];
M.cpos[1]=1; /*找到M中cpos的位置*/
for (col=2;col<=M.nu;col++)
M.cpos[col]=M.cpos[col-1]+M.num[col-1];
for (p=1;p<=M.tu;p++)
{
col=M.data[p].j;
q=M.cpos[col];
T->data[q].i=M.data[p].j;
T->data[q].j=M.data[p].i;
T->data[q].e=M.data[p].e;
++M.cpos[col];
}
}
}
8 楼
summerC [专家分:30] 发布于 2006-06-28 18:10:00
MultSMatrix(struct TSMtrix M,struct TSMtrix N,struct TSMtrix *Q)
{ /*稀疏矩阵相乘*/
int i,arow,brow,ccol,t,temp,p,q;
int ctemp[MAXRC+1]={0};
if (M.nu!=N.mu)
printf("Multiply error!");
Q->mu=M.mu;
Q->nu=N.nu;
Q->tu=0; /*Q初始化*/
/*---------------查询M中rpos的位置------------------*/
for (i=1;i<=M.mu;i++)
M.num[i]=0;
for (t=1;t<=M.tu;t++)
++M.num[M.data[t].i];
M.rpos[1]=1;
for (i=2;i<=M.mu;i++)
M.rpos[i]=M.rpos[i-1]+M.num[i-1];
/*---------------查询N中rpos的位置------------------*/
for (i=1;i<=N.mu;i++)
N.num[i]=0;
for (t=1;t<=N.tu;t++)
++N.num[N.data[t].i];
N.rpos[1]=1;
for (i=2;i<=N.mu;i++)
N.rpos[i]=N.rpos[i-1]+N.num[i-1];
/*---------------矩阵的相乘------------------*/
if (M.tu*N.tu!=0) /*Q为非零矩阵*/
{
for (arow=1;arow<=M.mu;arow++)
{
for (i=0;i<=N.nu;i++) /*处理M中的每一行*/
ctemp[i]=0; /*累加器ctemp每次都要清零*/
Q->rpos[arow]=Q->tu+1;
if (arow<M.mu)
temp=M.rpos[arow+1];
else
temp=M.tu+1;
for (p=M.rpos[arow];p<temp;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 )
printf("error!");
Q->data[Q->tu].i=arow;
Q->data[Q->tu].j=ccol;
Q->data[Q->tu].e=ctemp[ccol];
}
}
}
else
printf("There's no unzeroed element!");
}
main()
{
struct TSMtrix M;
struct TSMtrix T;
struct TSMtrix Q;
struct TSMtrix N;
CreateMtrix(&M);
ShowMtrix(M);
printf("\n");
CreateMtrix(&T);
ShowMtrix(T);
MultSMatrix(M,T,&Q);
ShowMtrix(Q);
FastTransposeSMtrix(Q,&N);
ShowMtrix(N);
getch();
}[
我来回复