Syntax:
Mat2System ($A, @variable_list, $b)
displays a system of linear equations, where$A
is a Matrix$b
is a Matrix or a Vector (or a ColumnVector)@variable_list
is a (Perl) list of strings (variable names)Example usage:
Mat2System (Matrix ([[1,2],[3,4]], "x", "y", Vector([5,6]))
Mat2System (Matrix ([[1,2,3],[4,5,6]], qw ("x_1 x_2 x_3 "), Matrix([[1],[2]]))
Code: (Free to use, as long as you credit me and Thomas Hagedorn (who wrote the original version))
sub Mat2System{ # Mat2System (A, qw(x y z w), b)
my $coeffs = shift;
my @vec = @_;
my $vname = pop @vec;
my ($srow, $scol) = $coeffs->dimensions;
my $vnamerow = scalar @vec;
my $vrow;
if ($vname -> class eq "Matrix") { $vrow = ($vname->dimensions)[0] }
if ($vname -> class eq "Vector") { $vrow = $vname -> length; }
die "Wrong number of rows or columns2" if ($vrow != $srow);
die "Wrong number of rows or columns4" if ($scol != $vnamerow);
my $outstr="\begin{array}";
my $s;
$outstr .= '{' . ('r' x (2 * $scol + 2)) . '}';
for (my $j = 0; $j < $srow; $j ++) {
$s = 0;
for (my $i = 0; $i < $scol; $i++) {
my $varname = $vec [$i];
my $a = $coeffs->element ($j + 1, $i + 1);
if ($a == 0) {
if (($s > 0) || ($i < $scol - 1)) { $outstr .= '&&'; }
else { $outstr .= '&0'; }
}
elsif ($a > 0) {
if ($a == 1) { $a = ""; }
if ($s==0) {$outstr .= "& $a \,$varname"; $s = 1; }
else {$outstr .= "&+& $a \, $varname"; }
}
else {
if ($s == 1) {
$a = -$a;
if ($a == 1) { $a = ""; }
$outstr .= "&- &$a \,$varname";
}
else {
if ($a == -1) { $a = "-"; }
$outstr = $outstr . "& $a \, $varname"; $s = 1;
}
}
}
if ($vname -> class eq "Matrix") { $outstr .= "&=&" . $vname->element($j+1, 1). "\\"; }
if ($vname -> class eq "Vector") { $outstr .= "&=&" . $vname->extract ($j+1). "\\"; }
}
$outstr . ' \end{array}';
}