稀疏矩阵运算

 行逻辑链接的三元组顺序表实现,加减乘和转置运算,调的好累,这两天少了点劲头了,坚持住,

试了好几组数据应该没问题了,但也可能还有漏洞```

 

 

  1. #include<iostream>
  2. #include<malloc.h>
  3. #include<stdlib.h>
  4. using namespace std;
  5. #define OK 1
  6. #define ERROR 0
  7. #define OVERFLOW -2
  8. typedef int Status;
  9. typedef struct
  10. {
  11. int i,j;
  12. int  e;}Triple;
  13. typedef struct
  14. {
  15. Triple *data;
  16. int *rpos;
  17. int mu,nu,tu;
  18. }RLSMatrix;
  19. Status CreateMatrix(RLSMatrix &a)           //创建
  20. {
  21. cin>>a.mu>>a.nu>>a.tu;
  22. a.data=(Triple*)malloc(a.tu*sizeof(Triple));
  23. a.rpos=(int*)malloc((a.mu+1)*sizeof(int));
  24. if(!a.data||!a.rpos) exit(OVERFLOW);
  25. int curow=0,k;
  26. for(k=0;k<a.tu;k++)
  27. {
  28.     do
  29.       {
  30.      cin>>a.data[k].i>>a.data[k].j>>a.data[k].e;
  31.      }while(a.data[k].i>a.mu||a.data[k].j>a.nu);
  32.  while(curow<a.data[k].i)
  33.       a.rpos[curow++]=k;         //如果当前行元素都为0,则指向下一行第一个非0元素 
  34.       }
  35.  while(curow<=a.mu)
  36.  a.rpos[curow++]=k;
  37. return OK;
  38. /*
  39. Status TransposeSMatrix(RLSMatrix a,RLSMatrix &b)               //转置
  40. {
  41.     b.mu=a.nu;b.nu=a.mu;b.tu=a.tu;
  42.  b.data=(Triple*)malloc(b.tu*sizeof(Triple)); 
  43.  b.rpos=(int*)malloc((b.mu+1)*sizeof(int));
  44.  if(!b.data||!b.rpos) exit(OVERFLOW);
  45.  int curow=0,k,col,p;
  46.     for(col=1,k=0;col<=a.nu;col++)
  47.     for(p=0;p<a.tu;p++)
  48.     if(a.data[p].j==col) 
  49.     {
  50.     while(curow<a.data[k].j)
  51.  b.rpos[curow++]=k;
  52.  b.data[k].j=a.data[p].i;
  53.     b.data[k].i=a.data[p].j;
  54.     b.data[k].e=a.data[p].e;
  55.     k++;
  56.     }
  57.    while(curow<=b.mu)
  58.     b.rpos[curow++]=k;
  59.     return OK;
  60. }
  61. */
  62. Status FastTransposeSMatrix(RLSMatrix a,RLSMatrix &b)       //快速转置
  63. {
  64.  b.mu=a.nu;b.nu=a.mu;b.tu=a.tu;
  65.  b.data=(Triple*)malloc(b.tu*sizeof(Triple));
  66.  int col,k,m,*num,*cpot;
  67.  num=(int*)malloc(a.nu*sizeof(int));
  68.  cpot=(int*)malloc(a.nu*sizeof(int));
  69.  b.rpos=(int*)malloc((b.mu+1)*sizeof(int));
  70.  if(!b.data||!b.rpos||!num||!cpot) exit(OVERFLOW);
  71.  if(b.tu)
  72.  {
  73.  for(col=0;col<a.nu;col++) num[col]=0;
  74.  for(k=0;k<a.tu;k++)
  75.   ++num[a.data[k].j-1];
  76.  b.rpos[0]=cpot[0]=0;
  77.  for(col=1;col<a.nu;col++) 
  78.   b.rpos[col]=cpot[col]=cpot[col-1]+num[col-1];
  79.   b.rpos[col]=cpot[col-1]+num[col-1];
  80.  for(k=0;k<a.tu;k++)
  81.         {
  82.   col=a.data[k].j-1; m=cpot[col];
  83.   b.data[m].i=a.data[k].j;b.data[m].j=a.data[k].i;
  84.   b.data[m].e=a.data[k].e;
  85.   cpot[col]++;}
  86.  free(num);free(cpot);
  87.    }
  88. return OK;} 
  89. Status AddSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)              //加法
  90. {
  91.    if(!(M.mu==N.mu&&M.nu==N.nu)) return ERROR;
  92.    Q.mu=M.mu;Q.nu=M.nu;Q.tu=0;
  93.    Q.data=(Triple*)malloc(Q.mu*Q.nu*sizeof(Triple));
  94.    Q.rpos=(int*)malloc((Q.mu+1)*sizeof(int));
  95.    if(!Q.data||!Q.rpos) exit(OVERFLOW);
  96.    int t,tp,temp,p,q;
  97.      for(int row=0;row<Q.mu;row++)
  98.           {  
  99.      Q.rpos[row]=Q.tu;
  100.      tp=M.rpos[row+1];
  101.               t=N.rpos[row+1];
  102.               for(p=M.rpos[row],q=N.rpos[row];p!=tp&&q!=t;p++)
  103.                     if(M.data[p].j<N.data[q].j) {
  104.                           Q.data[Q.tu].i=M.data[p].i;
  105.                           Q.data[Q.tu].j=M.data[p].j;                     
  106.                           Q.data[Q.tu++].e=M.data[p].e;}
  107.                     else if(M.data[p].j>N.data[q].j){
  108.                           Q.data[Q.tu].i=N.data[q].i;
  109.                           Q.data[Q.tu].j=N.data[q].j;                     
  110.                           Q.data[Q.tu++].e=N.data[q++].e;}
  111.                     else {
  112.                           temp=M.data[p].e+N.data[q].e;
  113.                           if(!temp) q++;
  114.         else{
  115.                                Q.data[Q.tu].i=N.data[q].i;
  116.                                Q.data[Q.tu].j=N.data[q].j;                     
  117.                                Q.data[Q.tu++].e=temp;
  118.                                q++;}     
  119.                                }
  120.           
  121.             while(p<tp) {Q.data[Q.tu].i=M.data[p].i;
  122.                          Q.data[Q.tu].j=M.data[p].j;                     
  123.                          Q.data[Q.tu++].e=M.data[p++].e;
  124.                         }
  125.             while (q<t){
  126.                         Q.data[Q.tu].i=N.data[q].i;
  127.                         Q.data[Q.tu].j=N.data[q].j;                     
  128.                         Q.data[Q.tu++].e=N.data[q++].e;}
  129.             
  130.             
  131.             }
  132.   Q.rpos[Q.mu]=Q.tu;
  133.         return OK;                      
  134. }
  135. Status SubSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)           //减法
  136. {
  137.    if(!(M.mu==N.mu&&M.nu==N.nu)) return ERROR;
  138.    Q.mu=M.mu;Q.nu=M.nu;Q.tu=0;
  139.    Q.data=(Triple*)malloc(Q.mu*Q.nu*sizeof(Triple));
  140.    Q.rpos=(int*)malloc((Q.mu+1)*sizeof(int));
  141.    if(!Q.data||!Q.rpos) exit(OVERFLOW);
  142.    int t,tp,temp,p,q;
  143.      for(int row=0;row<Q.mu;row++)
  144.           {  
  145.      Q.rpos[row]=Q.tu;
  146.      tp=M.rpos[row+1];
  147.               t=N.rpos[row+1];
  148.               for(p=M.rpos[row],q=N.rpos[row];p!=tp&&q!=t;p++)
  149.                     if(M.data[p].j<N.data[q].j) {
  150.                           Q.data[Q.tu].i=M.data[p].i;
  151.                           Q.data[Q.tu].j=M.data[p].j;                     
  152.                           Q.data[Q.tu++].e=M.data[p].e;}
  153.                     else if(M.data[p].j>N.data[q].j){
  154.                           Q.data[Q.tu].i=N.data[q].i;
  155.                           Q.data[Q.tu].j=N.data[q].j;                     
  156.                           Q.data[Q.tu++].e=-N.data[q++].e;}
  157.                     else {
  158.                           temp=M.data[p].e-N.data[q].e;
  159.                           if(!temp) q++;
  160.         else{
  161.                                Q.data[Q.tu].i=N.data[q].i;
  162.                                Q.data[Q.tu].j=N.data[q].j;                     
  163.                                Q.data[Q.tu++].e=temp;
  164.                                q++;}     
  165.                                }
  166.           
  167.             while(p<tp) {Q.data[Q.tu].i=M.data[p].i;
  168.                          Q.data[Q.tu].j=M.data[p].j;                     
  169.                          Q.data[Q.tu++].e=M.data[p++].e;
  170.                         }
  171.             while (q<t){
  172.                         Q.data[Q.tu].i=N.data[q].i;
  173.                         Q.data[Q.tu].j=N.data[q].j;                     
  174.                         Q.data[Q.tu++].e=-N.data[q++].e;}
  175.             
  176.             
  177.             }
  178.   Q.rpos[Q.mu]=Q.tu;
  179.         return OK;                      
  180. }
  181. Status MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)             //乘法
  182.        if(M.nu!=N.mu) return ERROR;
  183.        Q.mu=M.mu;Q.nu=N.nu;Q.tu=-1;
  184.        Q.data=(Triple*)malloc(Q.mu*Q.nu*sizeof(Triple));
  185.        Q.rpos=(int*)malloc((Q.mu+1)*sizeof(int));
  186.        int *ctemp=(int*)malloc(Q.nu*sizeof(int));
  187.     if(!Q.data||!Q.rpos||!ctemp) exit(OVERFLOW);
  188.     int tp,t,ccol,brow;
  189.     if(M.tu*N.tu!=0)
  190.     {
  191.           for(int arow=0;arow<M.mu;arow++)
  192.           {
  193.               for(int i=0;i<Q.nu;i++)
  194.                       ctemp[i]=0;
  195.               Q.rpos[arow]=Q.tu+1;
  196.               tp=M.rpos[arow+1];
  197.               for(int p=M.rpos[arow];p<tp;p++)
  198.                      {
  199.                             brow=M.data[p].j-1;
  200.                             t=N.rpos[brow+1];
  201.                             for(int q=N.rpos[brow];q<t;q++)
  202.                             {
  203.                                     ccol=N.data[q].j-1;
  204.                                     ctemp[ccol]+=M.data[p].e*N.data[q].e;
  205.                                     }
  206.                      }           
  207.            for(ccol=0;ccol<Q.nu;++ccol)
  208.              if(ctemp[ccol])
  209.                  {
  210.        ++Q.tu;                    
  211.        Q.data[Q.tu].i=arow+1;
  212.                       Q.data[Q.tu].j=ccol+1;
  213.                       Q.data[Q.tu].e=ctemp[ccol];
  214.                       }
  215.              }
  216.         Q.tu++;
  217.   Q.rpos[Q.mu]=Q.tu;
  218.         } 
  219.         return OK; 
  220. }
  221.  /*                      
  222. void PrintSMatrix(RLSMatrix a)               //输出rpos[]的值,用于测试
  223.    for(int i=0;i<=a.mu;i++)
  224.    cout<<a.rpos[i]<<" ";
  225.    cout<<endl;
  226. cout<<a.tu<<endl;}
  227. */
  228. void ShowSMatrix(RLSMatrix a)        //输出矩阵
  229. {
  230. cout<<endl;
  231. for(int row=1,k=0;row<=a.mu;row++)
  232. {for(int col=1;col<=a.nu;col++)
  233. if(a.data[k].i==row&&a.data[k].j==col)
  234. {cout<<a.data[k].e<<" ";k++;}
  235. else cout<<"0"<<" ";
  236. cout<<endl;}
  237. cout<<endl;
  238. }
  239. int main()
  240. {
  241. RLSMatrix a,b,c,d,e,f;
  242. CreateMatrix(a); 
  243. ShowSMatrix(a);
  244. //PrintSMatrix(a);
  245. CreateMatrix(b);
  246. ShowSMatrix(b);
  247. //PrintSMatrix(b);
  248. AddSMatrix(a,b,c);
  249. ShowSMatrix(c);
  250. //PrintSMatrix(c);
  251. SubSMatrix(a,b,d);
  252. ShowSMatrix(d);
  253. //PrintSMatrix(d);
  254. MultSMatrix(a,b,e);
  255. ShowSMatrix(e);
  256. //PrintSMatrix(e);
  257. FastTransposeSMatrix(a,f);
  258. ShowSMatrix(f);
  259. //PrintSMatrix(b);
  260. return 0;
  261. }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值