其他分享
首页 > 其他分享> > 稀疏矩阵及其压缩方法简述

稀疏矩阵及其压缩方法简述

作者:互联网

稀疏矩阵:

  在矩阵中,若数值为0的元素远远多于非0元素的数目,并且非0元素分布没有规律,则该矩阵为稀疏矩阵;

与之相反,若非0元素数目占大多数,则称该矩阵为稠密矩阵。

稀疏矩阵的应用

  稀疏矩阵应用非常广泛,如在机器学习领域,稀疏矩阵可以应用如下场景:

    1.用户是否看过电影库中的所有电影;

    2.用户是否购买了产品目录中的产品;

    3.歌曲目录中每首歌曲的收听次数

稀疏矩阵的表示方法

  Coordinate

    Coordinate是一种坐标形式的稀疏矩阵,使用三个数组,即values,rows,columns保存非0元素的信息。这三个数组长度相同。

    1.rows:数据所处的行

    2.values:实数或复数数据,包括矩阵中非0的元素,顺序任意

    3.数据所处的列

  coo存储的主要优点是灵活,简单,仅存储非0元素及每个非0元素的坐标。但是,coo不支持元素的存取和增删。

下面通过代码来初始化一个稀疏矩阵;

 

 那么假设一个数据元素的内存空间占一个单位,那该10*10的矩阵就占据100个单位!!!!、

接下来将用coo来表示上图中的稀疏矩阵

首先从第0行数据开始处理,从第0列开始遍历直到第9列,并把非0数据记录下来;在第0行第1列找到数据,用coo记录下来;

同样,第二行,第三行,,,,,第n行,同样按照上述方法进行遍历计算。

案例如下:将实现把一个稀疏矩阵通过coo方法保存下来!

public class demo1 {
    public static void main(String[] args){
       MatrixUtil matrixUtil = new MatrixUtil();
       int rowNum = 15;
       int colNum = 15;
       int[][] gameMartix = new int[rowNum][colNum];
       gameMartix[6][5] = 1;
       gameMartix[6][8] = 2;
       gameMartix[5][7] = 1;
       gameMartix[7][7] = 1;
       gameMartix[8][6] = 2;
       gameMartix[8][7] = 1;
       gameMartix[8][8] = 1;
       gameMartix[9][8] = 2;

       matrixUtil.printMartix(gameMartix);
       int[][] cooMartixCOO = matrixUtil.MatrixToCOO(gameMartix);
       matrixUtil.printMartix(cooMartixCOO);

    }

}
class MatrixUtil{
    public static int[][] MatrixToCOO(int[][] matrix){
        int num = 0;
        for(int row = 0;row < matrix.length;row++){
            for(int colum = 0;colum < matrix[row].length;colum++){
                if(matrix[row][colum] != 0){
                    num++;
                }
            }
        }
        System.out.println("稀疏矩阵的非零元素个数为:" + num);
        int[][] cooMartix = new int[3][num];
        int cooNum = 0;
        for(int row = 0; row<matrix.length;row++){
            for(int colum = 0;colum < matrix[row].length;colum++){
                if(matrix[row][colum] != 0){

                    cooMartix[0][cooNum] = row;
                    cooMartix[1][cooNum] = colum;
                    cooMartix[2][cooNum] = matrix[row][colum];
                    cooNum++;
                }
            }
        }
        System.out.println("放入COO的非零元素个数为:" + cooNum);
        return cooMartix;
    }
    public static void printMartix(int[][] martix){
        for(int row = 0;row < martix.length;row++){
            for(int colum = 0; colum < martix[row].length;colum++){

                System.out.print(martix[row][colum] + " ");


            }
            System.out.println("");
        }
    }

}

运行结果如下:

 

Over!!!!

标签:int,元素,矩阵,稀疏,简述,gameMartix,row
来源: https://www.cnblogs.com/99kol/p/16685699.html