作者在 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]);//打印一维数组 } }
|