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

1 Answer

0 votes
import Foundation

// 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 a full sparse matrix from compact triplet form
func buildSparseFromCompact(_ compact: [[Int]], count: Int) -> [[Int]] {

    let rowIdx = compact[0]
    let colIdx = compact[1]
    let values = compact[2]

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

    for i in 0..<count {
        if rowIdx[i] > maxRow { maxRow = rowIdx[i] }
        if colIdx[i] > maxCol { maxCol = colIdx[i] }
    }

    let rows = maxRow + 1
    let cols = maxCol + 1

    // Create full matrix initialized with zeros
    var sparse = Array(repeating: Array(repeating: 0, count: cols), count: rows)

    // Fill matrix
    for i in 0..<count {
        sparse[rowIdx[i]][colIdx[i]] = values[i]
    }

    return sparse
}

// Print a matrix
func printMatrix(_ mat: [[Int]], title: String) {
    print(title)
    for row in mat {
        print(row.map { String($0) }.joined(separator: " "))
    }
    print()
}

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

let compact = [
    [0, 0, 1, 1, 1, 3, 3, 3, 4],  // row indices
    [2, 4, 2, 3, 6, 1, 2, 5, 4],  // column indices
    [3, 8, 5, 7, 1, 2, 6, 4, 9]   // values
]

let count = 9

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

let sparse = buildSparseFromCompact(compact, count: count)

printMatrix(sparse, title: "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

...