How to compact a sparse matrix in Ruby

1 Answer

0 votes
# A sparse matrix is a matrix in which the majority of elements are zero.

# To compact a sparse matrix, use a method to store only the non‑zero
# entries using a triplet representation (row, column, value). 
# This reduces memory usage.

# Convert a sparse matrix into compact (triplet) form
def compact_matrix(matrix)
  rows = matrix.length
  cols = matrix[0].length

  # Count non-zero elements
  count = matrix.sum { |row| row.count { |v| v != 0 } }

  # Compact matrix has 3 rows: row index, col index, value
  compact = Array.new(3) { Array.new(count, 0) }

  k = 0

  # Fill compact matrix
  rows.times do |i|
    cols.times do |j|
      if matrix[i][j] != 0
        compact[0][k] = i      # row
        compact[1][k] = j      # column
        compact[2][k] = matrix[i][j] # value
        k += 1
      end
    end
  end

  compact
end

matrix = [
  [0, 0, 3, 0, 8, 0, 0, 0, 0],
  [0, 0, 5, 7, 0, 0, 1, 0, 0],
  [0, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 2, 6, 0, 0, 4, 0, 0, 0],
  [0, 0, 0, 0, 9, 0, 0, 0, 0]
]

compact = compact_matrix(matrix)

puts "Compact matrix:"
3.times do |i|
  puts compact[i].join(" ")
end



=begin
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 

=end

 



answered 1 day ago by avibootz
...