- package matrix;
-
- sub new {
- my ($c) = shift;
- my ($s) = {
- _rows => shift,
- _cols => shift,
- _def => shift,
- _entry => {}
- };
- bless $s, $c;
- return $s;
- }
-
- sub set {
- my ($s) = shift;
- for my $j (0..$s->{_rows}-1) {
- for my $k (0..$s->{_cols}-1) {
- my ($entry) = shift @_;
- last unless defined $entry;
- last unless defined $s->{_entry}->{$j, $k};
-
- $s->{_entry}->{$j, $k} = $entry unless $entry == $s->{_def};
- }
- }
- }
-
- sub multiply {
- my ($s, $l) = @_;
- my ($m) = new matrix $s->{_rows}, $l->{_cols};
- my (@entries);
-
- for my $j (0..$s->{_rows}-1) {
- for my $k (0..$l->{_cols}-1) {
- my ($sum) = 0;
- $sum += $s->{_entry}->{$j, $_}*$s->{_entry}->{$_, $k} for (0..$s->{_cols}-1);
- push @entries, $sum;
- }
- }
-
- $m->set(@entries);
- return $m;
- }
-
- sub string {
- my ($s, $padding) = @_;
- my ($str) = '';
-
- $padding = 5 unless defined $padding;
-
- for my $j (0..$s->{_rows}-1) {
- for my $k (0..$s->{_cols}-1) {
-
- my ($entry) = defined $s->{_entry}->{$j, $k} ?
- $s->{_entry}->{$j, $k} : $s->{_def};
-
- $str .= pad($entry, $padding);
- }
-
- $str .= "\n";
- }
-
- return $str;
- }
-
-
- sub pad {
- my ($s, $n) = (shift, shift);
-
- return ' ' x ($n - length $s) . $s;
- }
-
- 1;