How to reconstruct a full sparse matrix from a compact (triplet) matrix in Scala

1 Answer

0 votes
object RebuildSparseMatrix {

  // A sparse matrix is a matrix in which the majority of elements are zero.

  // To rebuild a sparse matrix from a compact (triplet) representation,
  // we create a full matrix initialized with zeros, then place each
  // non‑zero element at its (row, column) position.

  // Build full sparse matrix from compact triplet form
  def buildSparseFromCompact(compact: Array[Array[Int]], count: Int): Array[Array[Int]] = {

    val rowIdx = compact(0)
    val colIdx = compact(1)
    val values = compact(2)

    // Determine matrix dimensions automatically
    var maxRow = 0
    var maxCol = 0

    for (i <- 0 until count) {
      if (rowIdx(i) > maxRow) maxRow = rowIdx(i)
      if (colIdx(i) > maxCol) maxCol = colIdx(i)
    }

    val rows = maxRow + 1
    val cols = maxCol + 1

    // Create full matrix initialized with zeros
    val sparse = Array.fill(rows, cols)(0)

    // Fill matrix
    for (i <- 0 until count) {
      sparse(rowIdx(i))(colIdx(i)) = values(i)
    }

    sparse
  }

  // Print a matrix
  def printMatrix(mat: Array[Array[Int]], title: String): Unit = {
    println(title)
    mat.foreach { row =>
      println(row.mkString(" "))
    }
    println()
  }

  def main(args: Array[String]): Unit = {

    // Compact matrix:
    // 0 0 1 1 1 3 3 3 4
    // 2 4 2 3 6 1 2 5 4
    // 3 8 5 7 1 2 6 4 9

    val compact = Array(
      Array(0, 0, 1, 1, 1, 3, 3, 3, 4),  // row indices
      Array(2, 4, 2, 3, 6, 1, 2, 5, 4),  // column indices
      Array(3, 8, 5, 7, 1, 2, 6, 4, 9)   // values
    )

    val count = 9

    println("Compact matrix:")
    for (i <- 0 until 3) {
      println(compact(i).take(count).mkString(" "))
    }
    println()

    val sparse = buildSparseFromCompact(compact, count)

    printMatrix(sparse, "Sparse matrix (auto-sized):")
  }
}


/*
run:

Compact matrix:
0 0 1 1 1 3 3 3 4
2 4 2 3 6 1 2 5 4
3 8 5 7 1 2 6 4 9

Sparse matrix (auto-sized):
0 0 3 0 8 0 0
0 0 5 7 0 0 1
0 0 0 0 0 0 0
0 2 6 0 0 4 0
0 0 0 0 9 0 0

*/

 



answered 3 hours ago by avibootz

Related questions

...