package Mymx;
require Exporter;

@ISA = qw(Exporter);

@EXPORT = qw(
	show_matrix
	show_vector
	matrix_product
	matrix_times_vector
	mymx_field_width
	mymx_num_decimal_places);

# ----------------------------------------------------------------
$mymx_field_width        = 7;
$mymx_num_decimal_places = 4;

# ----------------------------------------------------------------
sub show_matrix
{
	my ($mxref, $mxdim) = @_;
	my $i;
	my $j;

	die "show_matrix():  Need as arguments matrix reference and dimension.\n"
		unless defined $mxdim;

	my $printf_format  = "%" . $mymx_field_width . "." . $mymx_num_decimal_places . "f";

	for $i (0 .. $mxdim - 1) {
		for $j (0 .. $mxdim - 1) {
			printf $printf_format, $$mxref[$i][$j];
			print " " if ($j < $mxdim - 1)
		}
		print "\n";
	}

	print "\n";
}

# ----------------------------------------------------------------
sub show_vector
{
	my ($vecref, $vecdim) = @_;
	my $i;
	my $j;

	die "show_vector():  Need as arguments vector reference and dimension.\n"
		unless defined $vecdim;

	my $printf_format  = "%" . $mymx_field_width . "." . $mymx_num_decimal_places . "f";

	for $i (0 .. $vecdim - 1) {
		printf $printf_format, $$vecref[$i];
		print " " if ($i < $vecdim - 1)
	}

	print "\n";
}

# ----------------------------------------------------------------
sub matrix_times_vector {
	my ($aref, $xref, $mxdim) = @_;
	my @b;

	my $i;
	my $j;

	die
"matrix_times_vector():  Need as arguments matrix reference, vector reference and dimension.\n"
		unless defined $mxdim;

	for $i (0 .. $mxdim - 1) {
		$b[$i] = 0.0;
		for $j (0 .. $mxdim - 1) {
			$b[$i] += $$aref[$i][$j] * $$xref[$j];
		}
	}

	return @b;
}

# ----------------------------------------------------------------
sub matrix_product {
	my ($aref, $bref, $mxdim) = @_;
	my @c;

	my $i;
	my $j;
	my $k;

	die "matrix_product():  Need as arguments two matrix references and dimension.\n"
		unless defined $mxdim;

	for $i (0 .. $mxdim - 1) {
		for $j (0 .. $mxdim - 1) {
			$c[$i][$j] = 0.0;
			for $k (0 .. $mxdim - 1) {
				$c[$i][$j] += $$aref[$i][$k] * $$bref[$k][$j];
			}
		}
	}

	return @c;
}

1;
