稀疏矩阵(实现快速转置和普通转置)
来源:互联网 发布:Apache 转发 跨域 编辑:程序博客网 时间:2024/05/16 01:48
1.M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。
2.稀疏矩阵的压缩存储:
压缩存储值存储极少数的有效数据。使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。
3.矩阵的转置:
将原矩阵的行、列对换,也就是将[i][j]和[j][i]位置上的数据对换。(转置有快速转置和普通转置)
template<class T>struct Triple //三元组{Triple(size_t row,size_t col,const T& data):_row(row),_col(col),_data(data){}Triple(){}size_t _row;size_t _col;T _data;};template<class T>class SparseMatrix{public:SparseMatrix(){}SparseMatrix(T* a,size_t m,size_t n,const T& invalid) //数组 行 列 非法值:_m(m),_n(n),_invalid(invalid){for(size_t i=0;i<_m;i++){for(size_t j=0;j<_n;j++){if(a[i*_n+j]!=_invalid){v.push_back (Triple<T>(i,j,a[i*_n+j]));}}}}//普通转置SparseMatrix<T> TransposedMatrix(){SparseMatrix<T> sm;sm._m =_n;//_m=5行sm._n =_m;//_n=6列sm._invalid =_invalid;sm.v.reserve (v.size());for(size_t i=0;i<_n;++i){size_t index=0;while(index<v.size()){if(v[index]._col==i){Triple<T> t(v[index]._col,v[index]._row,v[index]._data);sm.v .push_back (t);}++index;}}return sm;}//快速转置SparseMatrix<T> FastTransposedMatrix(){SparseMatrix<T> sm;sm._m =_n;//_m=5行sm._n =_m;//_n=6列sm._invalid =_invalid;sm.v.resize (v.size());int* count=new int[_n]; //统计转置后每一行数据的个数memset(count,0,_n*sizeof(int));int* start=new int[_n]; //统计转置后每一行在压缩矩阵存储的开始位置//统计个数转置后的size_t index=0;while(index<v.size ()){int row=v[index]._col;count[row]++;++index;}//开始位置start[0]=0;for(size_t i=1;i<_n;++i){start[i]=start[i-1]+count[i-1];}index=0;while(index<v.size()){Triple<T> t(v[index]._col,v[index]._row,v[index]._data);//三元组int row=v[index]._col; //得到行int begin=start[row]; //得到这一行转置后在v的初始位置sm.v[begin]=t; //在把这个数的信息插入进去start[row]++;++index;}delete[] count;delete[] start;return sm;}~SparseMatrix(){}void Display(){size_t k=0;for(size_t i=0;i<_m;i++){for(size_t j=0;j<_n;j++){if((i==v[k]._row)&&(j==v[k] ._col)){cout<<v[k] ._data<<" ";if(k<v.size ()-1)k++;}elsecout<<_invalid<<" ";}cout<<endl;}}protected:vector<Triple<T>> v;size_t _m;size_t _n;T _invalid;};void TestSparseMatrix(){int a[6][5]={{1,0,3,0,5},{0,0,0,0,0},{0,0,0,0,0},{2,0,4,0,6},{0,0,0,0,0},{0,0,0,0,0},};SparseMatrix<int> sm((int*)a,6,5,0);sm.Display ();/*SparseMatrix<int> tsm=sm.TransposedMatrix();tsm.Display ();*/SparseMatrix<int> ftsm=sm.FastTransposedMatrix ();ftsm.Display ();}
0 0
- 稀疏矩阵(实现快速转置和普通转置)
- java和js实现普通矩阵和稀疏矩阵(非满矩阵)的转置
- 稀疏矩阵的压缩储存,稀疏矩阵的普通转置,稀疏矩阵的快速转置
- 稀疏矩阵快速转置
- 稀疏矩阵快速转置
- 稀疏矩阵快速转置
- 稀疏矩阵(快速定位转置)
- 【C++】稀疏矩阵的普通转置与快速转置
- 稀疏矩阵的普通转置与快速转置算法
- 快速排序实现稀疏矩阵的转置
- 稀疏矩阵的转置和快速转置
- 稀疏矩阵的存储和快速转置
- 实验五:稀疏矩阵的存储和快速转置
- 5.3矩阵的压缩存储(稀疏矩阵转置和快速转置)
- 稀疏矩阵的快速转置
- 稀疏矩阵的快速转置
- 稀疏矩阵的快速转置
- 数据结构----稀疏矩阵的快速转置
- 数据库技术的发展简史
- ROS_Kinetic_28 turtlebot gazebo demo例子
- ViewPager
- Android与js交互(互相调用)
- spark安装和集群单机模式
- 稀疏矩阵(实现快速转置和普通转置)
- 面怎么煮更好吃?你必须知道的7个小技巧
- 用Node.js创建自签名的HTTPS服务器
- Jsp直接操作数据库
- udp/tcp
- ShaderLab基础(Pass定义)
- 产品经理与需求文档的一场奇妙之旅
- SQLServer使用SQL查看表的主键和外键字段
- Quick-Cocos2d-x文件结构分析