您的位置:首页 > 编程语言 > Java开发

Java实现稀疏矩阵的压缩

2018-03-11 17:05 1271 查看
首先给出维基百科里稀疏矩阵的概念:
数值分析中,稀疏矩阵(Sparse matrix),是其元素大部分为零的矩阵。反之,如果大部分元素都非零,则这个矩阵是稠密的。
其实很简单,就是矩阵元素大部分为0的矩阵。很明显用传统储存二维矩阵的方法会造成很大的内存浪费,当然传统方法也行,但不够优化,鉴于此便出现压缩矩阵的方法。举个例子,给出下面一个5X5的矩阵,

00130
50000
00600
00001
00900
这样一个矩阵有效数据只有其中非零数字,创建一个二维数组同样表示上述矩阵,但简单一些。
上述矩阵记为A,压缩后的矩阵记为B。A中非零数字有6个,创建的压缩矩阵B为7X3维。其中B的第一行存储原矩阵的信息,具体如下:
B[0][0]: 原矩阵的行数
B[0][1]: 原矩阵的列数
B[0][2]: 原矩阵中非零项的个数
以A[0][2]中的1为例,存进稀疏矩阵里信息依次是在A中的行数列数、以及数值1。
那么压缩后的矩阵B如下:

666
021
033
105
226
341
429
接下来用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++;
}
}
}输出结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息