c言語版データ構造(奇跡冬瓜)-配列と一般化テーブル(疎行列の乗算)
3663 ワード
//------- ---------
/*
:
3 0 0 5 0 2 0 6
M= 0 -1 0 0 N= 1 0 Q=-1 0 Q=M*N
2 0 0 0 -2 4 0 4
0 0
( 1)
:
M: N: Q: i j e
---------- ---------- ----------
i j e i j e i j e
---------- ---------- ----------
1 1 3 1 2 2 1 2 6
1 4 5 2 1 1 2 1 -1
2 2 -1 3 1 -2 3 2 4
3 1 2 3 2 4
( 2)
rpos ( ):
M: N: Q: row rpos
---------------- -------------------- -------------
row 1 2 3 row 1 2 3 4 row 1 2 3
---------------- -------------------- -------------
rpos 1 3 4 rpos 1 2 3 5 rpos 1 2 3
( 3)
n1
∑M(i,k)*N(k,j) 1=<i<=m1 1=<j<=n2 //
k=1
*/
#include<stdio.h>
#include<stdlib.h>
//
#define MAXSIZE 4
#define MAXRC 4
#define ERROR 0
#define OK 1
typedef int Status;
typedef struct
{
int i,j; //i,j
int e; //e
}Triple; // 1
typedef struct
{
Triple date[MAXSIZE+1]; //
int rops[MAXRC+1]; //
int mu,nu,tu; // , ,
}RLSMatrix; //
Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);//
void main()
{
RLSMatrix M,N,Q;
int k;
M.date[1].i=1;
M.date[1].j=1;
M.date[1].e=3;
M.date[2].i=1;
M.date[2].j=4;
M.date[2].e=5;
M.date[3].i=2;
M.date[3].j=2;
M.date[3].e=-1;
M.date[4].i=3;
M.date[4].j=1;
M.date[4].e=2;
M.rops[1]=1;
M.rops[2]=2;
M.rops[3]=4;
M.mu=3;
M.nu=4;
M.tu=4; // M
N.date[1].i=1;
N.date[1].j=2;
N.date[1].e=2;
N.date[2].i=2;
N.date[2].j=1;
N.date[2].e=1;
N.date[3].i=3;
N.date[3].j=1;
N.date[3].e=-2;
N.date[4].i=3;
N.date[4].j=2;
N.date[4].e=4;
N.rops[1]=1;
N.rops[2]=2;
N.rops[3]=3;
N.rops[4]=5;
N.mu=4;
N.nu=2;
N.tu=4; // N
MultSMatrix(M,N,&Q);
printf("Q:
-------------------
i\tj\te
-------------------
");
for(k=1;k<=Q.tu;k++)
{
printf("%d\t%d\t%d
",Q.date[k].i,Q.date[k].j,Q.date[k].e);
}
getchar();
getchar();
}
Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q)
{
int arow,ccol,ctemp[4]; //Q , ,
int tp,p,q,t,i,brow; //
Q->mu=M.mu;
Q->nu=N.nu;
Q->tu=0; //Q
if(M.nu!=N.mu)
{
return ERROR; // , ERROR
}
if(0!=M.tu*N.tu) // Q 0 ,
{
for(arow=1;arow<=M.mu;arow++)
{
for(i=0;i<4;i++)
{
ctemp[i]=0; // , M N ( )
}
Q->rops[arow]=Q->tu+1; // Q rops ( 3, )
if(arow<M.mu)
{
tp=M.rops[arow+1]; //tp
}
else
{
tp=M.tu+1;
}
for(p=M.rops[arow];p<tp;p++) // arow
{
brow=M.date[p].j; //∑M(i,k)*N(k,j) M N .
if(brow<N.mu)
{
t=N.rops[brow+1];
}
else
{
t=N.tu+1; // M
}
for(q=N.rops[brow];q<t;q++)
{
ccol=N.date[q].j;
ctemp[ccol]+=M.date[p].e*N.date[q].e; //
}
}
for(ccol=1;ccol<=Q->nu;ccol++)
{
if(ctemp[ccol])
{
if(++Q->tu>MAXSIZE)
{
return ERROR; //
}
Q->date[Q->tu].i=arow;
Q->date[Q->tu].j=ccol;
Q->date[Q->tu].e=ctemp[ccol];
}
}
}
}
return OK;
}