How to compact a sparse matrix in Swift

1 Answer

0 votes
import Foundation

// 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
func compactMatrix(_ matrix: [[Int]]) -> [[Int]] {
    let rows = matrix.count
    let cols = matrix[0].count

    // Count non-zero elements
    let count = (0..<rows).reduce(0) { acc, i in
        acc + (0..<cols).filter { j in matrix[i][j] != 0 }.count
    }

    // Compact matrix has 3 rows: row index, col index, value
    var compact = Array(repeating: Array(repeating: 0, count: count), count: 3)

    var k = 0

    // Fill compact matrix
    for i in 0..<rows {
        for j in 0..<cols {
            if matrix[i][j] != 0 {
                compact[0][k] = i        // row
                compact[1][k] = j        // column
                compact[2][k] = matrix[i][j] // value
                k += 1
            }
        }
    }

    return compact
}

let 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]
]

let compact = compactMatrix(matrix)

print("Compact matrix:")
for i in 0..<3 {
    print(compact[i].map { String($0) }.joined(separator: " "))
}


/*
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 

*/

 



answered 1 day ago by avibootz
...