Java实现稀疏矩阵的压缩
2018-03-11 17:05
1271 查看
首先给出维基百科里稀疏矩阵的概念:
在数值分析中,稀疏矩阵(Sparse matrix),是其元素大部分为零的矩阵。反之,如果大部分元素都非零,则这个矩阵是稠密的。
其实很简单,就是矩阵元素大部分为0的矩阵。很明显用传统储存二维矩阵的方法会造成很大的内存浪费,当然传统方法也行,但不够优化,鉴于此便出现压缩矩阵的方法。举个例子,给出下面一个5X5的矩阵,
这样一个矩阵有效数据只有其中非零数字,创建一个二维数组同样表示上述矩阵,但简单一些。
上述矩阵记为A,压缩后的矩阵记为B。A中非零数字有6个,创建的压缩矩阵B为7X3维。其中B的第一行存储原矩阵的信息,具体如下:
B[0][0]: 原矩阵的行数
B[0][1]: 原矩阵的列数
B[0][2]: 原矩阵中非零项的个数
以A[0][2]中的1为例,存进稀疏矩阵里信息依次是在A中的行数、列数、以及数值1。
那么压缩后的矩阵B如下:
接下来用java实现这一操作
第一步生成随机稀疏矩阵 final int _ROWS=5; //定义行数
final int _COLS=5; //定义列数
final int _NOTZERO=6; //定义稀疏矩阵中不为零的个数
int i,j,tmpRW,tmpCL,tmpNZ;
int temp=1;
int Sparse[][]=new int[_ROWS][_COLS]; //声明稀疏矩阵
int Compress[][]=new int[_NOTZERO+1][3];//声明压缩矩阵
for(i=0;i<_ROWS;i++) //将矩阵初始值都设为0
for(j=0;j<_COLS;j++)
Sparse[i][j]=0;
tmpNZ=_NOTZERO; //产生随机稀疏矩阵
for(i=1;i<tmpNZ+1;i++) {
tmpRW=(int)(Math.random()*100);
tmpRW=(tmpRW%_ROWS);
tmpCL=(int)(Math.random()*100);
tmpCL=(tmpCL%_COLS);
if(Sparse[tmpRW][tmpCL]!=0)
tmpNZ++;
Sparse[tmpRW][tmpCL]=i;
}
进行压缩 /*开始压缩稀疏矩阵*/
Compress[0][0]=_ROWS;
Compress[0][1]=_COLS;
Compress[0][2]=_NOTZERO;
for(i=0;i<_ROWS;i++) {
for(j=0;j<_COLS;j++) {
if(Sparse[i][j]!=0){
Compress[temp][0]=i;
Compress[temp][1]=j;
Compress[temp][2]=Sparse[i][j];
temp++;
}
}
}输出结果如下:
在数值分析中,稀疏矩阵(Sparse matrix),是其元素大部分为零的矩阵。反之,如果大部分元素都非零,则这个矩阵是稠密的。
其实很简单,就是矩阵元素大部分为0的矩阵。很明显用传统储存二维矩阵的方法会造成很大的内存浪费,当然传统方法也行,但不够优化,鉴于此便出现压缩矩阵的方法。举个例子,给出下面一个5X5的矩阵,
0 | 0 | 1 | 3 | 0 |
5 | 0 | 0 | 0 | 0 |
0 | 0 | 6 | 0 | 0 |
0 | 0 | 0 | 0 | 1 |
0 | 0 | 9 | 0 | 0 |
上述矩阵记为A,压缩后的矩阵记为B。A中非零数字有6个,创建的压缩矩阵B为7X3维。其中B的第一行存储原矩阵的信息,具体如下:
B[0][0]: 原矩阵的行数
B[0][1]: 原矩阵的列数
B[0][2]: 原矩阵中非零项的个数
以A[0][2]中的1为例,存进稀疏矩阵里信息依次是在A中的行数、列数、以及数值1。
那么压缩后的矩阵B如下:
6 | 6 | 6 |
0 | 2 | 1 |
0 | 3 | 3 |
1 | 0 | 5 |
2 | 2 | 6 |
3 | 4 | 1 |
4 | 2 | 9 |
第一步生成随机稀疏矩阵 final int _ROWS=5; //定义行数
final int _COLS=5; //定义列数
final int _NOTZERO=6; //定义稀疏矩阵中不为零的个数
int i,j,tmpRW,tmpCL,tmpNZ;
int temp=1;
int Sparse[][]=new int[_ROWS][_COLS]; //声明稀疏矩阵
int Compress[][]=new int[_NOTZERO+1][3];//声明压缩矩阵
for(i=0;i<_ROWS;i++) //将矩阵初始值都设为0
for(j=0;j<_COLS;j++)
Sparse[i][j]=0;
tmpNZ=_NOTZERO; //产生随机稀疏矩阵
for(i=1;i<tmpNZ+1;i++) {
tmpRW=(int)(Math.random()*100);
tmpRW=(tmpRW%_ROWS);
tmpCL=(int)(Math.random()*100);
tmpCL=(tmpCL%_COLS);
if(Sparse[tmpRW][tmpCL]!=0)
tmpNZ++;
Sparse[tmpRW][tmpCL]=i;
}
进行压缩 /*开始压缩稀疏矩阵*/
Compress[0][0]=_ROWS;
Compress[0][1]=_COLS;
Compress[0][2]=_NOTZERO;
for(i=0;i<_ROWS;i++) {
for(j=0;j<_COLS;j++) {
if(Sparse[i][j]!=0){
Compress[temp][0]=i;
Compress[temp][1]=j;
Compress[temp][2]=Sparse[i][j];
temp++;
}
}
}输出结果如下:
相关文章推荐
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- 【数据结构与算法】数组应用3:稀疏矩阵压缩(Java实现)
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- C语言 稀疏矩阵 压缩 实现
- 对称矩阵与压缩存储算法(java实现)
- C++实现稀疏矩阵的压缩存储、转置、快速转置
- C++实现稀疏矩阵的压缩存储实例
- 数据结构Java实现——④数组——>稀疏矩阵三元组顺序存储
- 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
- 三元组压缩存储稀疏矩阵的C++类模板实现
- 稀疏矩阵的压缩存储及转置,快速转置法,C++代码实现
- 三元组实现稀疏矩阵的压缩存储与转置 (Sparse matrix compression storage and transposition base on triple)
- C++ 实现稀疏矩阵的压缩存储的实例
- 基于内积法的Hadoop的MapReducer框架实现稀疏矩阵乘法(java)
- 稀疏矩阵的接压缩算法的实现
- 稀疏矩阵三元组方式压缩存储 c++模板类实现
- 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
- 数据结构编程笔记十三:第五章 数组和广义表 稀疏矩阵的压缩存储实现
- 三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
- 稀疏矩阵的压缩存储与快速转置 三元组法 类与对象实现