稀疏矩阵CSR存储的C++实现
实现了稀疏矩阵的生成(指定稀疏程度)、稀疏矩阵转换为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++实现相关推荐
- python稀疏矩阵的存储与表示
参考链接: https://blog.csdn.net/bitcarmanlee/article/details/52668477 https://blog.csdn.net/wangjian1204 ...
- 稀疏矩阵的存储以及转置、加法、乘法操作实现
1.稀疏矩阵的存储与表示 只存储稀疏矩阵中极少数的非零元素,采用一个三元组<row,column,value>来唯一确定一个矩阵元素:因此,稀疏矩阵可用一个三元组数组来表示.另外,还需要存 ...
- 稀疏矩阵的存储方法(DOK、LIL、COO、CSR, CRS)
存储稀疏矩阵 经常用二维数组来存储矩阵. 用数组的ai,ja_{i,j}ai,j可以用索引值iii和jjj访问.通常,iii是 行索引,从上往下编号,jjj是列索引,从左到右进行编号.对于m×nm ...
- C语言将CSR存储模式转为coo,将大型稀疏矩阵转换为COO时出错(Error converting large sparse matrix to COO)...
将大型稀疏矩阵转换为COO时出错(Error converting large sparse matrix to COO) 我遇到了下面的问题,试图浏览两个大的CSR矩阵: /usr/lib/pyth ...
- 一种比较省内存的稀疏矩阵Python存储方案
原文:http://www.pythontab.com/html/2014/pythonhexinbiancheng_0522/788.html 推荐系统中经常需要处理类似user_id, item_ ...
- 数据结构 - 十字链表之稀疏矩阵的存储
当数组中非零元素非常少时,我们可以称之为稀疏矩阵.为了减少空间的浪费,在存储稀疏矩阵的时候,我们对它进行压缩存储,即指存储非零信息. 一.数组的顺序存储 在存储稀疏矩阵的时候,除了存储非零元素的值,还 ...
- 【数据结构和算法笔记】:稀疏矩阵的存储结构详解
稀疏矩阵定义: 稀疏矩阵和特殊矩阵的不同点: 特殊矩阵的特殊元素分布(值相同元素,常量元素)有规律 稀疏矩阵的特殊元素(非0元素)分布没有规律 三元组储存 例: 所以,该稀疏矩阵的三元组线性表为 稀疏 ...
- 稀疏矩阵------三元组存储---笔记
SparseMatrix.h #include<cstdio> #define maxTerms 30 typedef int DataType; typedef struct {int ...
- cuda operator稀疏矩阵csr相加
https://docs.nvidia.com/cuda/cusparse/#cusparse-generic-function-spsm beta表示加减 #include <iostream ...
最新文章
- 在Ubuntu14.04安装F.lux
- OVS DPDK--报文处理流程(八)
- Elicpse创建Maven项目
- 改进初学者的PID-初始化
- 女程序员,说多了都是泪!
- oracle脚本导入mysql数据库_oracle脚本导入mysql数据库
- Struts2中Action的属性接收参数
- uva 10891 - Game of Sum
- mongodb笔记2
- html和css的重难点知识
- AJAX初始化combox 并取值
- JAVA CRC16校验码计算
- web前端性能优化的方法
- vs201x下正则表达式过滤中文
- excel找出重复值
- WordPress使用腾讯云CDN配置如何实现https访问?
- 一文搞定深度学习入门级电脑硬件配置
- 刘桉齐:敏捷回顾会七步成诗法 | 真北群友作品
- 从智能音箱发展,看智能家居的未来
- Qt使用第三方串口类qextserialport无法打开串口的可能解决方案(文章中描述的可以解决)
热门文章
- Docker容器处于Removal in process 无法删除解决方案
- 关于ssm文件上传报错400,面对错误我们只能说亚麻跌,达咩,达咩哟!
- 浅谈Android各版本sdk区别
- Fiddler过滤器设置--屏蔽不需要分析的文件
- 合天网安 在线实验 CTF竞赛 writeup(第六周 | 套娃一样的上传、第二十一周 | 你的空格哪去了、第十周 | 试试协议吧、第十一周 | 签到般的包含、第九周 | 试下phpinfo吧)
- matlab 遍历每个像素点,Mat中两种像素遍历方法比较
- 易订货专属App文档
- 济宁商业学校计算机,济宁商业学校2021年招生录取分数线
- WebDAV之葫芦儿·派盘 + Strongbox
- NSIS Error的解决办法