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; }