java 稀疏矩陣
阿新 • • 發佈:2018-12-15
稀疏矩陣 一般用 (x, y, value) 三元組來儲存矩陣非零元素,當矩陣只有少量非零元素時,可以大大減少儲存空間。
本文實現的稀疏矩陣只實現了
- 一般矩陣 和 稀疏矩陣 之間的轉換
- 讀取稀疏元素
- 儲存稀疏元素
package matrix;
import java.util.HashMap;
import java.util.Map;
public class SparseMatrix{
Map<String, Double> pairs= new HashMap<>();
int rowNum,colNum;
boolean sizeFixed;
// 如果沒有初始化矩陣維數,稀疏矩陣大小可變
public SparseMatrix(){
sizeFixed = false;
}
public SparseMatrix(int r, int c){
sizeFixed = true;
rowNum = r;
colNum = c;
}
public int getRowNum() {
return rowNum;
}
public int getColNum() {
return colNum;
}
// 新增矩陣元素
public void put(int x, int y, double v) throws IndexException{
checkIndex(x,y);
if(v != 0)
pairs.put(SparseIndex(x,y),v);
}
// 獲取矩陣元素
public Double get(int x, int y) throws IndexException{
checkIndex(x,y);
Double v = pairs.get(SparseIndex(x,y));
if(v == null) {
v = Double.valueOf(0);
}
return v;
}
// 轉換為 一般矩陣
public double[][] toDensity (){
double[][] mat = new double[rowNum][colNum];
for(int i=0; i<rowNum; ++i) {
for(int j=0; j<colNum; ++j) {
try {
mat[i][j] = get(i,j);
} catch (IndexException e) {
}
}
}
return mat;
}
// 從一般矩陣 轉換為 稀疏矩陣
static public SparseMatrix fromDensity(double [][] mat){
SparseMatrix sm = new SparseMatrix(mat.length,mat[0].length);
for(int i=0; i<mat.length; ++i) {
for(int j=0; j<mat[0].length; ++j) {
try {
if(mat[i][j] != 0) {
sm.put(i,j,mat[i][j]);
}
} catch (IndexException e) {
}
}
}
return sm;
}
// 把矩陣索引轉換成字串,用於雜湊索引
static public String SparseIndex(int x, int y){
return String.valueOf(x)+","+String.valueOf(y);
}
// 檢查是否越界,下標越界則丟擲異常
private void checkIndex(int x, int y) throws IndexException{
if(sizeFixed) {
if(x >= rowNum || y >= colNum) {
throw new IndexException(
"Index out of bound: ("+String.valueOf(x)+","+String.valueOf(y)+"), "+
"(rowNum,colNum)=("+String.valueOf(rowNum)+","+String.valueOf(colNum)+")."
);
}
}else {
rowNum = rowNum>x+1?rowNum:x+1;
colNum = colNum>y+1?colNum:y+1;
}
}
// 自定義異常
class IndexException extends Exception {
public IndexException (String message){
super (message);
}
public IndexException (String message, Exception cause) {
super(message,cause);
}
}
// 測試
public static void main(String[] args) {
SparseMatrix sm = new SparseMatrix();
try {
sm.put(0, 0, 1.0);
sm.put(2, 1, 2.0);
sm.put(1, 4, -9);
} catch (SparseMatrix.IndexException e) {
e.printStackTrace();
}
double [][] mat = SparseMatrix.fromDensity(sm.toDensity()).toDensity();
for(int i=0; i<sm.getRowNum(); ++i) {
for(int j=0; j<sm.getColNum(); ++j) {
System.out.print(mat[i][j]);
System.out.print(" ");
}
System.out.println();
}
}
}
測試結果:
1.0 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 -9.0
0.0 2.0 0.0 0.0 0.0