实现了稀疏矩阵的生成(指定稀疏程度)、稀疏矩阵转换为CSR、从CSR中恢复出矩阵、稀疏矩阵和向量的乘法等功能。从运行结果来看,稀疏矩阵存储为CSR格式和向量相乘的运行速度快于普通矩阵向量乘法,而且稀疏程度越高,优势越明显。

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<stdio.h>
typedef int dtype;
using namespace std;
void csr_to_matrix(dtype *value,dtype *colindex,dtype *rowptr,int n,int a,dtype** & M){M=new int*[n];for(int i=0;i<n;i++)M[i]=new int[n];for(int i=0;i<n;i++)for(int j=0;j<n;j++)M[i][j]=0;for(int i=0;i<n;i++)for(int j=rowptr[i];j<rowptr[i+1];j++)M[i][colindex[j]]=value[j];return;
}void spmv(dtype *value,dtype *rowptr,dtype *colindex,int n,int a,dtype *x,dtype *y){//calculate the matrix-vector multiply where matrix is stored in the form of CSRfor(int i=0;i<n;i++){dtype y0=0;for(int j=rowptr[i];j<rowptr[i+1];j++)y0+=value[j]*x[colindex[j]];y[i]=y0;}return;
}int matrix_to_csr(int n,dtype **M,dtype* &value,dtype* & rowptr,dtype* & colindex){int i,j;int a=0;for(i=0;i<n;i++)for(j=0;j<n;j++)if(M[i][j]!=0)a++;value=new dtype[a];colindex=new int[a];rowptr=new int[n+1];int k=0;int l=0;for(i=0;i<n;i++)for(j=0;j<n;j++){if(j==0)rowptr[l++]=k;if(M[i][j]!=0){value[k]=M[i][j];colindex[k]=j;k++;}}rowptr[l]=a;return a;
}void matrix_multiply_vector(dtype **m,int n,dtype *x,dtype *y){for(int i=0;i<n;i++){dtype y0=0;for(int j=0;j<n;j++)y0+=m[i][j]*x[j];y[i]=y0;}return;
}void generate_sparse_matrix(dtype** & m,int n,double s){m=new int*[n];for(int i=0;i<n;i++)m[i]=new int[n];for(int i=0;i<n;i++)for(int j=0;j<n;j++){int x=rand()%100;if(x>100*s)m[i][j]=0;elsem[i][j]=x+1;}return;
}void print_matrix(dtype **m,int n){for(int i=0;i<n;i++)for(int j=0;j<n;j++){cout<<m[i][j]<<",";if(j==n-1)cout<<endl;}return;
}void generate_vector(int n,dtype* & x){x=new int[n];for(int i=0;i<n;i++)x[i]=rand()%100-50;return;
}void print_vector(int n,dtype* x){for(int i=0;i<n;i++)cout<<x[i]<<" ";return;
}
int main(){srand(time(0));int n;double s;cout<<"输入n:";cin>>n;cout<<"输入矩阵稀疏程度:";cin>>s;dtype **mat=NULL;dtype **mat_recover=NULL;dtype *vec=NULL;dtype *y=NULL;dtype *yy=NULL;dtype *value=NULL;int *colindex=NULL;int *rowptr=NULL;generate_sparse_matrix(mat,n,s);generate_vector(n,vec);generate_vector(n,y);generate_vector(n,yy);int a=matrix_to_csr(n,mat,value,rowptr,colindex);csr_to_matrix(value,colindex,rowptr,n,a,mat_recover);cout<<"matrix and csr transformation test"<<endl;int error=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(mat[i][j]!=mat_recover[i][j])error=1;if(error==1)cout<<"test error!"<<endl;elsecout<<"test right!"<<endl;cout<<"spvm test"<<endl;clock_t start,end;start=clock();matrix_multiply_vector(mat,n,vec,y);end=clock();printf("time1=%f\n",(double)(end-start)/CLK_TCK);start=clock();spmv(value,rowptr,colindex,n,a,vec,yy);end=clock();printf("time2=%f\n",(double)(end-start)/CLK_TCK);for(int i=0;i<n;i++)if(y[i]!=yy[i]){cout<<"test error!"<<endl;return -1;}cout<<"test right!"<<endl;return 0;
}

稀疏矩阵CSR存储的C++实现相关推荐

  1. python稀疏矩阵的存储与表示

    参考链接: https://blog.csdn.net/bitcarmanlee/article/details/52668477 https://blog.csdn.net/wangjian1204 ...

  2. 稀疏矩阵的存储以及转置、加法、乘法操作实现

    1.稀疏矩阵的存储与表示 只存储稀疏矩阵中极少数的非零元素,采用一个三元组<row,column,value>来唯一确定一个矩阵元素:因此,稀疏矩阵可用一个三元组数组来表示.另外,还需要存 ...

  3. 稀疏矩阵的存储方法(DOK、LIL、COO、CSR, CRS)

    存储稀疏矩阵 经常用二维数组来存储矩阵. 用数组的ai,ja_{i,j}ai,j​可以用索引值iii和jjj访问.通常,iii是 行索引,从上往下编号,jjj是列索引,从左到右进行编号.对于m×nm ...

  4. C语言将CSR存储模式转为coo,将大型稀疏矩阵转换为COO时出错(Error converting large sparse matrix to COO)...

    将大型稀疏矩阵转换为COO时出错(Error converting large sparse matrix to COO) 我遇到了下面的问题,试图浏览两个大的CSR矩阵: /usr/lib/pyth ...

  5. 一种比较省内存的稀疏矩阵Python存储方案

    原文:http://www.pythontab.com/html/2014/pythonhexinbiancheng_0522/788.html 推荐系统中经常需要处理类似user_id, item_ ...

  6. 数据结构 - 十字链表之稀疏矩阵的存储

    当数组中非零元素非常少时,我们可以称之为稀疏矩阵.为了减少空间的浪费,在存储稀疏矩阵的时候,我们对它进行压缩存储,即指存储非零信息. 一.数组的顺序存储 在存储稀疏矩阵的时候,除了存储非零元素的值,还 ...

  7. 【数据结构和算法笔记】:稀疏矩阵的存储结构详解

    稀疏矩阵定义: 稀疏矩阵和特殊矩阵的不同点: 特殊矩阵的特殊元素分布(值相同元素,常量元素)有规律 稀疏矩阵的特殊元素(非0元素)分布没有规律 三元组储存 例: 所以,该稀疏矩阵的三元组线性表为 稀疏 ...

  8. 稀疏矩阵------三元组存储---笔记

    SparseMatrix.h #include<cstdio> #define maxTerms 30 typedef int DataType; typedef struct {int ...

  9. cuda operator稀疏矩阵csr相加

    https://docs.nvidia.com/cuda/cusparse/#cusparse-generic-function-spsm beta表示加减 #include <iostream ...

最新文章

  1. 在Ubuntu14.04安装F.lux
  2. OVS DPDK--报文处理流程(八)
  3. Elicpse创建Maven项目
  4. 改进初学者的PID-初始化
  5. 女程序员,说多了都是泪!
  6. oracle脚本导入mysql数据库_oracle脚本导入mysql数据库
  7. Struts2中Action的属性接收参数
  8. uva 10891 - Game of Sum
  9. mongodb笔记2
  10. html和css的重难点知识
  11. AJAX初始化combox 并取值
  12. JAVA CRC16校验码计算
  13. web前端性能优化的方法
  14. vs201x下正则表达式过滤中文
  15. excel找出重复值
  16. WordPress使用腾讯云CDN配置如何实现https访问?
  17. 一文搞定深度学习入门级电脑硬件配置
  18. 刘桉齐:敏捷回顾会七步成诗法 | 真北群友作品
  19. 从智能音箱发展,看智能家居的未来
  20. Qt使用第三方串口类qextserialport无法打开串口的可能解决方案(文章中描述的可以解决)

热门文章

  1. Docker容器处于Removal in process 无法删除解决方案
  2. 关于ssm文件上传报错400,面对错误我们只能说亚麻跌,达咩,达咩哟!
  3. 浅谈Android各版本sdk区别
  4. Fiddler过滤器设置--屏蔽不需要分析的文件
  5. 合天网安 在线实验 CTF竞赛 writeup(第六周 | 套娃一样的上传、第二十一周 | 你的空格哪去了、第十周 | 试试协议吧、第十一周 | 签到般的包含、第九周 | 试下phpinfo吧)
  6. matlab 遍历每个像素点,Mat中两种像素遍历方法比较
  7. 易订货专属App文档
  8. 济宁商业学校计算机,济宁商业学校2021年招生录取分数线
  9. WebDAV之葫芦儿·派盘 + Strongbox
  10. NSIS Error的解决办法