Java稀疏矩阵创建

时间:2014-12-18 12:23:24

标签: java matrix sparse-matrix

我目前正在创建一个使用SparseMatrixNode的稀疏矩阵程序:

 public SparseMatrixNode(int row, int col, int value, SparseMatrixNode down, SparseMatrixNode across)
  {
      this.row = row;
      this.col = col;
      this.value = value;
      this.down = down;
      this.across = across;
  }

我的程序创建模板稀疏矩阵,如下所示:

  public SparseMatrix()
  {
    noofrows=noofcols=0;    
    // create the top-left entry point cell
    root=new SparseMatrixNode(0, 0, 0, new SparseMatrixNode(0, 0, 0, null, null), new SparseMatrixNode(0, 0, 0, null, null));
  }     


  public void Create(int noofrows, int noofcols)
  {
      this.noofrows=noofrows;
      this.noofcols=noofcols;
      root=new SparseMatrixNode(0, 0, 0, new SparseMatrixNode(noofrows+1, 0, 0, null, null), new SparseMatrixNode(0, noofcols+1, 0, null, null));
  }

这是我的SetValue函数,它接受三个整数值来替换当前值或创建一个新节点并将其插入稀疏矩阵。

 public void SetValue(int row, int col, int value)
  {     
      if (value == 0)
      {
          return;
      }
      else
      {
          SparseMatrixNode checkNode = FindNode(row, col);
          if (checkNode.value != 0)
          {
              checkNode.setValue(value);
          }
          //SparseMatrixNode dummyRow = root.FindRow(row);
          if (root.down.row == 5)
          {
              root.down = new SparseMatrixNode(row, 0, 0, null, new SparseMatrixNode(row, col, value, null, null));
              root.across = new SparseMatrixNode(0, col, 0, new SparseMatrixNode(row, col, value, null, null), null);
          }          
      }

然而,当我基于4x4网格测试我的代码并调用SetValue(1,2,5)时,它只输出0到0的网格。 我一直试图逐步完成我的代码并找出为什么它没有输入新节点但是我已经被困了几个小时并且想知道是否有人可以对这种情况有所了解? / p>

所以我的问题是:为什么我的SetValue函数没有创建一个新节点并将其链接到" dummy"横向和向下属性(第0行第0列)?

1 个答案:

答案 0 :(得分:1)

如果您没有显示Find方法和负责打印的代码,很难说出了什么问题。

然而,你的方法对我来说似乎有点费解。我发现使用Map位置值更容易(这就是所谓的Keys of Keys表示)。值得注意的是,稀疏矩阵可能存在更高效的存储格式,具体取决于您要执行的操作。列出了一些规范示例here

以下是“词典词典”方法的工作示例。

import java.util.*;

class Position {
    private Integer row, col;

    public Position(int row, int col)
    {
        this.row = row;
        this.col = col;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Position))
            return false;
        Position other = (Position)o;
        return row == other.row && col == other.col;
    }

    @Override
    public int hashCode() {
        return 31 * row.hashCode() + col.hashCode();
    }

    @Override
    public String toString() {
        return String.format("(%d, %d)", row, col);
    }

}

public class SparseMatrix {

    private Map<Position, Integer> nnzs = new HashMap<>();
    private int maxRows, maxCols;

    public SparseMatrix(int maxRows, int maxCols) {
        this.maxRows = maxRows;
        this.maxCols = maxCols;
    }

    public void SetValue(int row, int col, int value) {     
        if (row > maxRows || col > maxCols)
            throw new RuntimeException("Position out of bounds");
        nnzs.put(new Position(row, col), value);
    }

    public static void main(String[] args) {
        SparseMatrix sp = new SparseMatrix(10, 10);
        sp.SetValue(1, 2, 5);
        System.out.println(sp.nnzs);
        sp.SetValue(1, 2, 7);
        sp.SetValue(1, 10, 8);
        System.out.println(sp.nnzs);
    }
}

输出:

javac SparseMatrix.java && java SparseMatrix
{(1, 2)=5}
{(1, 2)=7, (1, 10)=8}