<?php
// General things
$debug_on = false;
$size = 3;
$matrix = array();
$inverse = array();
function makeOne($n) {
global $debug_on;
global $matrix;
global $inverse;
global $size;
$val = $matrix[$n][$n];
if($val == 0) {
echo "ERROR: Cell (", $n + 1, ", ", $n + 1, ") must not be 0.\n";
}
$multiplier = (1/$val);
if ($debug_on) {
echo "Multiplier: ", $multiplier, "\n";
}
for($i = 0;$i < $size; $i++) {
$matrix[$n][$i] *= $multiplier;
$inverse[$n][$i] *= $multiplier;
}
}
function makeZero($row, $cell) {
global $matrix;
global $inverse;
global $size;
global $debug_on;
$val = $matrix[$row][$cell];
if($val == 0) {
return;
}
$op = -1 * $val;
if($debug_on) {
echo "Op: ", $op, "\n";
}
for ($i = 0;$i < $size;$i++) {
$matrix[$row][$i] += $op * $matrix[$cell][$i];
$inverse[$row][$i] += $op * $inverse[$cell][$i];
}
}
function getMatrix() {
global $matrix;
global $size;
$i = 0;
$j = 0;
while ($i < $size && $j < $size) {
$title = "Enter Value for (" . ($i + 1) . ", " . ($j + 1) . ")";
$val = $matrix[$i][$j];
$matrix[$i][$j] = " ?? ";
displayMatrix($matrix, $title);
$matrix[$i][$j] = $val;
echo "Enter Value (", $i + 1, ", ", $j + 1, "): ";
$s = trim(fgets(STDIN));
if (is_numeric($s)) {
$matrix[$i][$j] = (float) $s;
}
if ($j < ($size - 1)) {
$j++;
} else {
$j = 0;
$i++;
}
}
displayMatrix($matrix, "Final Input");
echo "Is this correct [y/N]? ";
$s = strtolower(trim(fgets(STDIN)));
if($s == "n" || $s == "0" || $s == "no") {
getMatrix();
} else {
echo "\nCALCULATING…\n";
}
}
function displayMatrix(&$matrix, $title = "Untitled") {
global $size;
$bar = "\n|" . str_repeat("-", ($size * 6) - 1) . "|\n";
echo "\n", $title, " [MATRIX]: ", $bar;
for ($i = 0;$i < $size;$i++) {
for($j = 0;$j < $size;$j++) {
$s = round($matrix[$i][$j], 2);
if ($matrix[$i][$j] == " ?? ") {
$s = $matrix[$i][$j];
}
echo "| ", str_replace("-0", " 0", str_pad($s, 4, " ", STR_PAD_LEFT));
}
echo "|", $bar;
}
echo "\n";
}
function getSize() {
global $size;
global $matrix;
global $inverse;
echo "Enter matrix size: ";
$size = (int) trim(fgets(STDIN));
// Populate the inverse matrix
for($i = 0;$i < $size;$i++) {
$matrix[$i] = array();
$inverse[$i] = array();
for ($j = 0;$j < $size;$j++) {
$matrix[$i][$j] = 0;
$inverse[$i][$j] = ($j == $i ? 1: 0);
}
}
}
getSize();
getMatrix();
for ($i = 0;$i < $size;$i++) {
makeOne($i);
displayMatrix($matrix, "Making One");
for ($j = 0;$j < $size;$j++) {
if($j != $i) {
makeZero($j, $i);
displayMatrix($matrix, "Making Zero");
}
}
}
displayMatrix($inverse, "Inverse");
?>
// General things
$debug_on = false;
$size = 3;
$matrix = array();
$inverse = array();
function makeOne($n) {
global $debug_on;
global $matrix;
global $inverse;
global $size;
$val = $matrix[$n][$n];
if($val == 0) {
echo "ERROR: Cell (", $n + 1, ", ", $n + 1, ") must not be 0.\n";
}
$multiplier = (1/$val);
if ($debug_on) {
echo "Multiplier: ", $multiplier, "\n";
}
for($i = 0;$i < $size; $i++) {
$matrix[$n][$i] *= $multiplier;
$inverse[$n][$i] *= $multiplier;
}
}
function makeZero($row, $cell) {
global $matrix;
global $inverse;
global $size;
global $debug_on;
$val = $matrix[$row][$cell];
if($val == 0) {
return;
}
$op = -1 * $val;
if($debug_on) {
echo "Op: ", $op, "\n";
}
for ($i = 0;$i < $size;$i++) {
$matrix[$row][$i] += $op * $matrix[$cell][$i];
$inverse[$row][$i] += $op * $inverse[$cell][$i];
}
}
function getMatrix() {
global $matrix;
global $size;
$i = 0;
$j = 0;
while ($i < $size && $j < $size) {
$title = "Enter Value for (" . ($i + 1) . ", " . ($j + 1) . ")";
$val = $matrix[$i][$j];
$matrix[$i][$j] = " ?? ";
displayMatrix($matrix, $title);
$matrix[$i][$j] = $val;
echo "Enter Value (", $i + 1, ", ", $j + 1, "): ";
$s = trim(fgets(STDIN));
if (is_numeric($s)) {
$matrix[$i][$j] = (float) $s;
}
if ($j < ($size - 1)) {
$j++;
} else {
$j = 0;
$i++;
}
}
displayMatrix($matrix, "Final Input");
echo "Is this correct [y/N]? ";
$s = strtolower(trim(fgets(STDIN)));
if($s == "n" || $s == "0" || $s == "no") {
getMatrix();
} else {
echo "\nCALCULATING…\n";
}
}
function displayMatrix(&$matrix, $title = "Untitled") {
global $size;
$bar = "\n|" . str_repeat("-", ($size * 6) - 1) . "|\n";
echo "\n", $title, " [MATRIX]: ", $bar;
for ($i = 0;$i < $size;$i++) {
for($j = 0;$j < $size;$j++) {
$s = round($matrix[$i][$j], 2);
if ($matrix[$i][$j] == " ?? ") {
$s = $matrix[$i][$j];
}
echo "| ", str_replace("-0", " 0", str_pad($s, 4, " ", STR_PAD_LEFT));
}
echo "|", $bar;
}
echo "\n";
}
function getSize() {
global $size;
global $matrix;
global $inverse;
echo "Enter matrix size: ";
$size = (int) trim(fgets(STDIN));
// Populate the inverse matrix
for($i = 0;$i < $size;$i++) {
$matrix[$i] = array();
$inverse[$i] = array();
for ($j = 0;$j < $size;$j++) {
$matrix[$i][$j] = 0;
$inverse[$i][$j] = ($j == $i ? 1: 0);
}
}
}
getSize();
getMatrix();
for ($i = 0;$i < $size;$i++) {
makeOne($i);
displayMatrix($matrix, "Making One");
for ($j = 0;$j < $size;$j++) {
if($j != $i) {
makeZero($j, $i);
displayMatrix($matrix, "Making Zero");
}
}
}
displayMatrix($inverse, "Inverse");
?>