用户注册



邮箱:

密码:

用户登录


邮箱:

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

发表随想


还能输入: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、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

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

加载中,请稍后...