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

1 Answer

0 votes
// 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
function buildSparseFromCompact(array $compact, int $count): array {

    $rowIdx = $compact[0];
    $colIdx = $compact[1];
    $values = $compact[2];

    // Determine matrix dimensions automatically
    $maxRow = 0;
    $maxCol = 0;

    for ($i = 0; $i < $count; $i++) {
        if ($rowIdx[$i] > $maxRow) $maxRow = $rowIdx[$i];
        if ($colIdx[$i] > $maxCol) $maxCol = $colIdx[$i];
    }

    $rows = $maxRow + 1;
    $cols = $maxCol + 1;

    // Create full matrix initialized with zeros
    $sparse = array_fill(0, $rows, array_fill(0, $cols, 0));

    // Fill matrix
    for ($i = 0; $i < $count; $i++) {
        $sparse[$rowIdx[$i]][$colIdx[$i]] = $values[$i];
    }

    return $sparse;
}

// Print a matrix
function printMatrix(array $mat, string $title): void {
    echo $title . PHP_EOL;
    foreach ($mat as $row) {
        foreach ($row as $x) {
            echo $x . " ";
        }
        echo PHP_EOL;
    }
    echo PHP_EOL;
}

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

$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
];

$count = 9;

echo "Compact matrix:" . PHP_EOL;
for ($i = 0; $i < 3; $i++) {
    for ($j = 0; $j < $count; $j++) {
        echo $compact[$i][$j] . " ";
    }
    echo PHP_EOL;
}
echo PHP_EOL;

$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 2 hours ago by avibootz

Related questions

...