1. 程式人生 > >java 稀疏矩陣

java 稀疏矩陣

稀疏矩陣 一般用 (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