# 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