稀疏矩阵
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律,则称改矩阵为稀疏矩阵。反正则为稠密矩阵。
Coordinate(COO)
使用values, rows, columns 三个数组来保存非0元素的信息。这三个数组长度相同。
- values: 矩阵中的非零元素数据,顺序任意(一般行优先)
- rows: 数据所处的行
- columns:数据所处的列
代码实现
- 稀疏矩阵转化为COO表示:
public class MatrixUtil {
public static int[][] MatrixToCOO(int[][] matrix) {
int num = 0;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] != 0){
num++;
}
}
}
int[][] Coo = new int[3][num];
int CooNum = 0;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] != 0){
Coo[0][CooNum] = i;
Coo[1][CooNum] = j;
Coo[2][CooNum] = matrix[i][j];
CooNum++;
}
}
}
return Coo;
}
public static void printMatrix(int[][] matrix) {
for (int i = 0; i <matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println("");
}
}
}
测试:
public class MatrixDemo {
/**
* @param args
*/
public static void main(String[] args) {
int rowNum = 15; // 棋盘行数
int columnNum = 15; // 棋盘列数
// 初始化五子棋盘面
int[][] gomokuMatrix = new int[rowNum][columnNum];
gomokuMatrix[6][5] = 1;
gomokuMatrix[6][8] = 2;
gomokuMatrix[7][6] = 1;
gomokuMatrix[7][7] = 2;
gomokuMatrix[8][6] = 2;
gomokuMatrix[8][7] = 1;
gomokuMatrix[8][8] = 1;
gomokuMatrix[9][8] = 2;
// 打印矩阵
MatrixUtil.printMatrix(gomokuMatrix);
// 转为COO表示
int[][] cooMatrix = MatrixUtil
.MatrixToCOO(gomokuMatrix);
// 打印矩阵
MatrixUtil.printMatrix(cooMatrix);
}
}
结果如下:
- COO表示转稀疏矩阵
public static int[][] COOToMatrix(int[][] Coo,int rows,int cols) {
int[][] matrix = new int[rows][cols];
for (int i = 0; i < Coo.length; i++) {
for (int j = 0; j < Coo[0].length; j++) {
matrix[Coo[0][j]][Coo[1][j]] = Coo[2][j];
}
}
return matrix;
}
测试:
public class MatrixDemo {
/**
* @param args
*/
public static void main(String[] args) {
int rowNum = 15; // 棋盘行数
int columnNum = 15; // 棋盘列数
// 初始化五子棋盘面
int[][] gomokuMatrix = new int[rowNum][columnNum];
gomokuMatrix[6][5] = 1;
gomokuMatrix[6][8] = 2;
gomokuMatrix[7][6] = 1;
gomokuMatrix[7][7] = 2;
gomokuMatrix[8][6] = 2;
gomokuMatrix[8][7] = 1;
gomokuMatrix[8][8] = 1;
gomokuMatrix[9][8] = 2;
// 打印矩阵
MatrixUtil.printMatrix(gomokuMatrix);
// 转为COO表示
int[][] cooMatrix = MatrixUtil
.MatrixToCOO(gomokuMatrix);
// 打印矩阵
MatrixUtil.printMatrix(cooMatrix);
// COO表示转为稀疏数组
int[][] matrix = MatrixUtil.COOToMatrix(cooMatrix,
rowNum, columnNum);
// 打印矩阵
MatrixUtil.printMatrix(matrix);
}
}
结果如下: