稀疏矩阵的乘法运算

数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。

 

本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.

 

输入

 

第1个稀疏矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

第2个稀疏矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组
   

 

以行为主序输入稀疏矩阵三元组表

 

输出

 

       乘积矩阵的行数
          列数
          非零元个数(三个数都大于0)
          三元组

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 3↵
  2. 4↵
  3. 4↵
  4. 1 1 3↵
  5. 1 4 5↵
  6. 2 2 -1↵
  7. 3 1 2↵
  8. 4↵
  9. 2↵
  10. 4↵
  11. 1 2 2↵
  12. 2 1 1↵
  13. 3 1 -2↵
  14. 3 2 4↵
以文本方式显示
  1. 3↵
  2. 2↵
  3. 3↵
  4. 1,2,6↵
  5. 2,1,-1↵
  6. 3,2,4↵
1秒256KB0
测试用例 2以文本方式显示
  1. 100↵
  2. 1↵
  3. 2↵
  4. 1 1 1↵
  5. 2 1 1↵
  6. 1↵
  7. 100↵
  8. 2↵
  9. 1 1 1↵
  10. 1 100 1↵
以文本方式显示
  1. 100↵
  2. 100↵
  3. 4↵
  4. 1,1,1↵
  5. 1,100,1↵
  6. 2,1,1↵
  7. 2,100,1↵
1秒64M0

 

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#define MAXSIZE 9999   
#define MAXRC 9999  
   
typedef struct{  
    int i,j; //该非零元行下标、列下标   
    int e;  //值   
}Triple;  
  
typedef struct{  
    Triple data[MAXSIZE+1];  
    int rpos[MAXRC+1];  
    int mu,nu,tu;  
}RLSMatrix;  
  
void MultSMatrix(RLSMatrix a,RLSMatrix b,RLSMatrix &c,int anum[],int bnum[] ){  
    if(a.nu!=b.mu) return;  
    c.mu=a.mu;  
    c.nu=b.nu;  
    c.tu=0;  //c初始化  
    int arow,ctemp[10000],tp,p,q,brow,t,ccol,i;  
    if(a.tu*b.tu!=0)  //c为非零矩阵   
    {  
        for(arow=1;arow<=a.mu;++arow)  //处理a的每一行   
        {  
            if(anum[arow]==0) continue;   
            for(i=0;i<10000;i++) ctemp[i]=0;  //当前行各元素累加器清零   
            c.rpos[arow]=c.tu+1;   
            if(arow<a.mu) tp=a.rpos[arow+1];  //tp记录(a矩阵前arow行的非零元的数量+1)   
            else tp=a.tu+1;  
            for(p=a.rpos[arow];p<tp;++p)  //对a矩阵当前行中每一个非零元   
            {                     
                brow=a.data[p].j;       //找到对应元在b矩阵中的行号   
                    if(bnum[brow]==0) continue;   
                if(brow<b.mu) t=b.rpos[brow+1];    //t记录(b矩阵前brow行的非零元的数量+1)   
                else t=b.tu+1;  
                for(q=b.rpos[brow];q<t;++q)  // 对b矩阵当前行中每一个非零元   
                {  
                  
                    ccol=b.data[q].j;       //乘积元素在c中的列号   
                    ctemp[ccol] += a.data[p].e*b.data[q].e;  
                    //printf("ctemp[%d]:%d %d*%d\n",ccol,ctemp[ccol],a.data[p].e,b.data[q].e);            
                }  
            }  
            for(ccol=1;ccol<=c.nu;++ccol)  
            {  
                if(ctemp[ccol])  
                {  
                    c.tu++;  
                    c.data[c.tu].i=arow;  
                    c.data[c.tu].j=ccol;  
                    c.data[c.tu].e=ctemp[ccol];  
                    //printf("(%d,%d) %d\n",arow,ccol,ctemp[ccol]);  
                }  
                  
            }   
                  
        }  
     }   
     return;  
}   
  
int main(){  
    RLSMatrix a,b,c;  
    scanf("%d\n%d\n%d\n",&a.mu,&a.nu,&a.tu);  
    int i;  
    for(i=1;i<=a.tu;++i)  
    {  
        scanf("%d%d%d",&a.data[i].i,&a.data[i].j,&a.data[i].e);  
    }  
    scanf("%d\n%d\n%d\n",&b.mu,&b.nu,&b.tu);  
    for(i=1;i<=b.tu;++i)  
    {  
        scanf("%d%d%d",&b.data[i].i,&b.data[i].j,&b.data[i].e);  
    }  
      
    int anum[a.mu+1],bnum[b.mu+1],row,t;  
      
    for(row=1;row<=a.mu;++row)   anum[row]=0;  
    for(t=1;t<=a.tu;++t)   
    {  
        ++anum[a.data[t].i];  
    }  
    int u=1;  
    while(anum[u]<0) u++;  
    a.rpos[u]=1;  
    for(row=u+1;row<=a.mu;++row)   
    {  
        //if(anum[row]==0) break;  
        a.rpos[row]=a.rpos[row-1]+anum[row-1];  
        //printf("A %d\n",a.rpos[row]);  
    }  
      
    for(row=1;row<=b.mu;++row)   bnum[row]=0;  
    for(t=1;t<=b.tu;++t) ++bnum[b.data[t].i];  
    u=1;  
    while(bnum[u]<0) u++;  
    b.rpos[u]=1;  
    for(row=u+1;row<=b.mu;++row)   
    {  
        //if(bnum[row]==0) break;  
        b.rpos[row]=b.rpos[row-1]+bnum[row-1];  
        //printf("A %d\n",b.rpos[row]);  
    }  
      
    MultSMatrix(a,b,c,anum,bnum);  
    printf("%d\n%d\n%d\n",c.mu,c.nu,c.tu);  
    for(i=1;i<=c.tu;++i)  
    {  
        printf("%d,%d,%d\n",c.data[i].i,c.data[i].j,c.data[i].e);  
    }  
}  

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值