对称矩阵的压缩
n阶对称矩阵:只存储上三角或者下三角矩阵中的元素,把原来需要存储n*n个元素压缩至n*(n-1)/2个元素
//对称矩阵的压缩算法
public class SymeMatric {
double[] a;// 矩阵元素
int n; // 矩阵的阶数
int m;// 一维数组的元素的个数--长度
public SymeMatric(int n) {
// 对称矩阵中不重复元素,保存到一维数组中所需要的一维数组的长度
// 2阶对称矩阵对应(1+2=3)维数组,3阶对称矩阵对应1+2+3=6维数组,
// 4阶对称矩阵对应1+2+3+4维数组,n阶对称矩阵对应前n项和,
// 所以一维数组的长度m的值为1,2,3...n的前n项和
m = n * (n + 1) / 2;
a = new double[m];
this.n = n;
}
// 通过一个二维数组来初始化
public void evalute(double[][] b) {
int k = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// i >= j表示只保存下三角元素
if (i >= j) {
a[k++] = b[i][j];
}
}
}
}
// 通过一个一维数组来初始化,那么这个一维数组就是对称矩阵元素的一个副本
public void evalute(double[] b) {
for (int k = 0; k < m; k++) {
a[k] = b[k];
}
}
// 对称矩阵相加
public SymeMatric add(SymeMatric b) {
SymeMatric t = new SymeMatric(n);
int k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i >= j) {
k = i * (i - 1) / 2 + j - 1;
} else {
k = j * (j - 1) / 2 + i - 1;
}
// 求和
t.a[k] = a[k] + b.a[k];
}
}
return t;
}
// 打印对称矩阵,这个才是关键!!
public void print() {
int k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i >= j) {
k = i * (i - 1) / 2 + j - 1;
} else {
k = j * (j - 1) / 2 + i - 1;
}
System.out.print(" " + a[k]);
}
System.out.println();
}
}
}
三角矩阵的压缩
m对角矩阵:非零元素在每行中有m个,一维数组s[k]和A[i][j]的对应关系为:k = m*i+j
稀疏矩阵的压缩
矩阵m*n如果有t个非零元素,那么s = t/m*n称为矩阵的稀疏因子,如果s<=0.05那么矩阵为稀疏矩阵
注:三元组顺序表表示,其中三元组格式为(i,j,e)记录了非零元素的行号、列号以及非零元素
inal 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++;
}
}
}