用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

稀疏矩阵的乘积

2012-10-10 作者: 神马举报

[c]代码库

define SMAX 1024 /*一个足够大的数*/
typedef struct
{
	int i,j; /*非零元素的行、列*/
	datatype v; /*非零元素值*/
} SPNode; /*三元组类型*/
typedef struct
{
	int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/
	SPNode data[SMAX]; /*三元组表*/
} SPMatrix; /*三元组表的存储类型*/


SPMatrix *MulSMatrix ( SPMatrix *A, SPMatrix *B )
/*稀疏矩阵A(m1× n1)和B(m2× n2) 用三元组表存储,求A×B */
{
	SPMatrix *C; /* 乘积矩阵的指针*/
	int p,q,i,j,k,r;
	datatype temp[n+1];
	int num[B->nu+1],rpot[B->nu+1];
	if ( A->nu!=B->mu ) return NULL; /*A 的列与B 的行不相等*/
	C=malloc ( sizeof ( SPMatrix ) ); /*申请C 矩阵的存储空间*/
	C->mu=A->mu;
	C->nu=B->nu;
	if ( A->tu*B->tu==0 ) {C->tu=0; return C; }
	for ( i=1; i<= B->mu; i++ ) num[i]=0; /*求矩阵B 中每一行非零元素的个数*/
	for ( k=1; k<=B->tu; k++ )
	{
		i= B->data[k].i;
		num[i]++;
	}
	rpot[1]=1; /*求矩阵B 中每一行第一个非零元素在B.data 中的位置*/
	for ( i=2; i<=B->mu; i++ )
		rpot[i]= rpot[i-1]+num[i-1];
	r=0; /*当前C 中非零元素的个数*/
	p=1; /*指示A.data 中当前非零元素的位置*/
	for ( i= 1; i<=A->mu; i++ )
	{
		for ( j=1; j<=B->nu; j++ ) temp[j]=0; /*cij 的累加器初始化*/
		while ( A->data[p].i==i ) ./*求第i 行的*/
			{ k=A->data[p].j; /*A 中当前非零元的列号*/
			  if ( k<B->mu ) t=rpot[k+1];
			  else t=B->tu+1; /*确定B 中第k 行的非零元素在B.data 中的下限位置*/
				  for ( q=rpot[k]; q<t; q++; ) /* B 中第k 行的每一个非零元素*/
				{
					j=B->data[q].j;
						temp[j]+=A->data[p].v * B->data[q].v
					         }
		         p++;
		} /* while */
		for ( j=1; j<=B->nu; j++ )
			if ( temp[j] )
			{
				r++;;
				C->data[r]={i,j,temp[j] };
			}
	} /*for i*/
	C->tu=r;
	return C;
}/* MulSMatrix */


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...