问题:

        现在有一个五子棋盘,如下,需要你进行存盘,然后以后在玩的时候还可以继续上一盘,你可以直接把这个11X11的棋盘直接保存到一个二维数组中,然后写进文件夹,但是你会发现,此时11X11的棋盘只有3个数据,其他都是无用的,占用内存空间,这显然转换成稀疏矩阵在存储,明显可以省略很多空间,接下来我们用Java代码模拟把它转换成稀疏矩阵,再从稀疏矩阵还原成原矩阵。

pytorch 稠密矩阵转稀疏矩阵 稀疏矩阵转换矩阵_稀疏矩阵

 首先我们定义一个跟棋盘大小

的二维数组,然后给对应的位置赋值。

//五子棋盘矩阵转换成稀疏矩阵,规定白为 1 ,黑为 2
        //先定义五子棋棋盘,放置对应棋子
        int sum = 0; //棋盘中数据的个数
        int array1[][] = new int[11][11];
        array1[1][2] = 1;
        array1[2][3] = 2;
        array1[3][4] = 2;
        for (int i=0;i<array1.length;i++){
            for (int j=0;j<array1[0].length;j++){
                System.out.printf("%d\t",array1[i][j]);
                if (array1[i][j]!=0){
                    ++sum;
                }
            }
            System.out.printf("\n");
        }

 输出结果看一下:

0    0    0    0    0    0    0    0    0    0    0    
0    0    1    0    0    0    0    0    0    0    0    
0    0    0    2    0    0    0    0    0    0    0    
0    0    0    0    2    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    

 第二步:定义一个稀疏矩阵,稀疏矩阵第一行就是就是原矩阵的行数列数和数据个数,下面就是每个数据的行数列数和数据值。


上面原矩阵可以转换成这样的稀疏矩阵 ,具体代码实现:

//将矩阵转换成稀疏矩阵
        //1、定义稀疏矩阵:因为稀疏矩阵有三列,行数是数据的个数加上第一行记录原矩阵的信息
        int array2[][] = new int[sum+1][3];
        //2、给稀疏矩阵赋值
        array2[0][0] = array1.length;
        array2[0][1] = array1[0].length;
        array2[0][2] = sum;
        //3、遍历array1将数据存入array2中
        int count=0;//用于稀疏矩阵行数自增
        for (int i=0;i<array1.length;i++){
            for (int j=0;j<array1[0].length;j++){
                if (array1[i][j]!=0){
                    ++count;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];
                }
            }
        }

然后我们输出稀疏矩阵看看:

//输出稀疏矩阵查看效果
        for (int i=0;i<array2.length;i++){
            for (int j=0;j<array2[0].length;j++){
                System.out.printf("%d\t",array2[i][j]);
            }
            System.out.printf("\n");
        }

11    11    3    
1      2     1    
2      3     2    
3      4     2      

此时我们已经将原矩阵转换成稀疏矩阵了。

最后我们根据稀疏矩阵转换成正常矩阵并输出:

//将稀疏矩阵还原成原矩阵
        //1、根据稀疏矩阵定义原矩阵的大小
        int array3[][] = new int[array2[0][0]][array2[0][1]];
        //2、遍历稀疏矩阵将数据放入原矩阵
        for (int i=1;i<array2.length;i++){
                array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }
        //遍历恢复后的矩阵,查看结果
        for (int i=0;i<array3.length;i++){
            for (int j=0;j<array3[0].length;j++){
                System.out.printf("%d\t",array3[i][j]);
            }
            System.out.printf("\n");
        }

0    0    0    0    0    0    0    0    0    0    0    
0    0    1    0    0    0    0    0    0    0    0    
0    0    0    2    0    0    0    0    0    0    0    
0    0    0    0    2    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
0    0    0    0    0    0    0    0    0    0    0    
 

至此,我们已经完成了将矩阵转换稀疏矩阵,和稀疏矩阵还原成原矩阵。如果你会使用io流的话,你可以尝试着转换成稀疏矩阵存入文件,然后读取文件,将稀疏矩阵转换成原矩阵。

源代码:

public class Matrix2SparseMatrix {
    public static void main(String[] args) {
        //五子棋盘矩阵转换成稀疏矩阵,规定白为 1 ,黑为 2
        //先定义五子棋棋盘,放置对应棋子
        int sum = 0; //棋盘中数据的个数
        int array1[][] = new int[11][11];
        array1[1][2] = 1;
        array1[2][3] = 2;
        array1[3][4] = 2;
        for (int i=0;i<array1.length;i++){
            for (int j=0;j<array1[0].length;j++){
                System.out.printf("%d\t",array1[i][j]);
                if (array1[i][j]!=0){
                    ++sum;
                }
            }
            System.out.printf("\n");
        }

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

        //将矩阵转换成稀疏矩阵
        //1、定义稀疏矩阵:因为稀疏矩阵有三列,行数是数据的个数加上第一行记录原矩阵的信息
        int array2[][] = new int[sum+1][3];
        //2、给稀疏矩阵赋值
        array2[0][0] = array1.length;
        array2[0][1] = array1[0].length;
        array2[0][2] = sum;
        //3、遍历array1将数据存入array2中
        int count=0;//用于稀疏矩阵行数自增
        for (int i=0;i<array1.length;i++){
            for (int j=0;j<array1[0].length;j++){
                if (array1[i][j]!=0){
                    ++count;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];
                }
            }
        }

        //输出稀疏矩阵查看效果
        for (int i=0;i<array2.length;i++){
            for (int j=0;j<array2[0].length;j++){
                System.out.printf("%d\t",array2[i][j]);
            }
            System.out.printf("\n");
        }

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

        //将稀疏矩阵还原成原矩阵
        //1、根据稀疏矩阵定义原矩阵的大小
        int array3[][] = new int[array2[0][0]][array2[0][1]];
        //2、遍历稀疏矩阵将数据放入原矩阵
        for (int i=1;i<array2.length;i++){
                array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }
        //遍历恢复后的矩阵,查看结果
        for (int i=0;i<array3.length;i++){
            for (int j=0;j<array3[0].length;j++){
                System.out.printf("%d\t",array3[i][j]);
            }
            System.out.printf("\n");
        }
    }
}