2014-12-18 6 views
0

Я в настоящее время создает редкую программу матрицы, которая использует SparseMatrixNode:Java разреженных матриц Создание

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); 
      }   
     } 

Однако, когда я проверить мой код, основанный на сетке 4х4 и вызова SetValue (1, 2, 5), он просто выводит сетку из 0-х. Я пытался выполнить мой код и узнать, почему он не вводит новый узел, но я застрял в течение нескольких часов и задавался вопросом, может ли кто-нибудь осветить ситуацию?

Итак, мой вопрос: почему моя функция SetValue не создает новый узел и связывает его со свойствами «манекена» в целом и вниз (строка 0 столбец 0)?

ответ

1

Трудно сказать, что не так, если вы не указали метод Find и код, ответственный за печать.

Однако, ваш подход кажется немного запутанным для меня. Мне легче использовать Map Позиций для значений (это так называемое представление словаря ключей). Стоит отметить, что могут быть более эффективные форматы хранения для разреженных матриц, в зависимости от того, какую операцию вы хотите выполнить. Несколько канонических примеров перечислены 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}