稀疏矩阵相乘——比书上更容易理解的算法

作者在 2010-08-06 22:36:26 发布以下内容
      看严蔚敏的数据结构关于稀疏矩阵相乘的一节,觉得有点复杂,自己按照个人理解,写了一个相乘的程序,把相乘后的矩阵先转化成了一维数组,代码如下

     自己感觉,貌似比书上的容易理解,而且简单多了,(好像花费的时间和原算法是一样的),各位指点指点

#include <stdio.h>

#include <stdlib.h>



#define max 12



typedef struct{

        int i,j;

        int e;

}triple;



typedef struct{

        triple data[max+1];

        int mu,tu,nu;

}tsmatrix;



void main()

{

        tsmatrix M;

        tsmatrix N;

        int Q[7]={0};//数组下标从1开始

        int p=1,q=1;//下面很长的一部分,是直接输入三元组,

        int s=1;



        M.mu=3;//行数

        M.nu=5;//列数

        M.tu=6;//非零元的个数



        M.data[1].i=1;                          

        M.data[1].j=1;

        M.data[1].e=3;



        M.data[2].i=1;

        M.data[2].j=4;

        M.data[2].e=5;



        M.data[3].i=1;

        M.data[3].j=5;

        M.data[3].e=-2;



        M.data[4].i=2;

        M.data[4].j=2;

        M.data[4].e=-1;



        M.data[5].i=3;

        M.data[5].j=1;

        M.data[5].e=2;



        M.data[6].i=3;

        M.data[6].j=5;

        M.data[6].e=4;



        N.mu=5;//行数

        N.nu=2;//列数

        N.tu=6;//非零元的个数



        N.data[1].i=1;

        N.data[1].j=2;

        N.data[1].e=2;



        N.data[2].i=2;

        N.data[2].j=1;

        N.data[2].e=1;



        N.data[3].i=3;

        N.data[3].j=1;

        N.data[3].e=-2;



        N.data[4].i=3;

        N.data[4].j=2;

        N.data[4].e=4;



        N.data[5].i=5;

        N.data[5].j=1;

        N.data[5].e=3;



        N.data[6].i=5;

        N.data[6].j=2;

        N.data[6].e=6;



        for(p=1;p<=M.tu;p++)  //进入正题

        {

                for(q=1;q<=N.tu;q++)

                {

                        if(M.data[p].j==N.data[q].i)

                        {

                               printf("p=%d,q=%d \n",p,q);//打印测试



                               printf("%d,%d,%d \n",M.data[p].e,N.data[q].e,(M.data[p].i-1)*N.nu+N.data[q].j);//打印测试

                

                                Q[(M.data[p].i-1)*N.nu+N.data[q].j]+=M.data[p].e*N.data[q].e;//将相乘的结果先存入一维数组

                        }

                        else continue;

                }

        }

        

        for(s=1;s<=6;s++)

        {

                printf("%d ",Q[s]);//打印一维数组

        }

}

 

数据结构 | 阅读 1159 次
文章评论,共0条
游客请输入验证码
浏览1615次
文章归档
最新评论