0%

数据结构-矩阵压缩

对称矩阵的压缩

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++;
        }
    }
}
    

链接:https://www.cnblogs.com/gaosheng-221/p/6133443.html