Matt Owen

source code for "files/pe/matrix.pm"

return to portfolio
  1.  package matrix;
  2.  
  3.  sub new {
  4.   my ($c) = shift;
  5.   my ($s) = {
  6.   _rows => shift,
  7.   _cols => shift,
  8.   _def => shift,
  9.   _entry => {}
  10.   };
  11.   bless $s, $c;
  12.   return $s;
  13.  }
  14.  
  15.  sub set {
  16.   my ($s) = shift;
  17.   for my $j (0..$s->{_rows}-1) {
  18.   for my $k (0..$s->{_cols}-1) {
  19.   my ($entry) = shift @_;
  20.   last unless defined $entry;
  21.   last unless defined $s->{_entry}->{$j, $k};
  22.  
  23.   $s->{_entry}->{$j, $k} = $entry unless $entry == $s->{_def};
  24.   }
  25.   }
  26.  }
  27.  
  28.  sub multiply {
  29.   my ($s, $l) = @_;
  30.   my ($m) = new matrix $s->{_rows}, $l->{_cols};
  31.   my (@entries);
  32.  
  33.   for my $j (0..$s->{_rows}-1) {
  34.   for my $k (0..$l->{_cols}-1) {
  35.   my ($sum) = 0;
  36.   $sum += $s->{_entry}->{$j, $_}*$s->{_entry}->{$_, $k} for (0..$s->{_cols}-1);
  37.   push @entries, $sum;
  38.   }
  39.   }
  40.  
  41.   $m->set(@entries);
  42.   return $m;
  43.  }
  44.  
  45.  sub string {
  46.   my ($s, $padding) = @_;
  47.   my ($str) = '';
  48.  
  49.   $padding = 5 unless defined $padding;
  50.  
  51.   for my $j (0..$s->{_rows}-1) {
  52.   for my $k (0..$s->{_cols}-1) {
  53.  
  54.   my ($entry) = defined $s->{_entry}->{$j, $k} ?
  55.   $s->{_entry}->{$j, $k} : $s->{_def};
  56.  
  57.   $str .= pad($entry, $padding);
  58.   }
  59.  
  60.   $str .= "\n";
  61.   }
  62.  
  63.   return $str;
  64.  }
  65.  
  66.  #
  67.  sub pad {
  68.   my ($s, $n) = (shift, shift);
  69.  
  70.   return ' ' x ($n - length $s) . $s;
  71.  }
  72.  
  73.  1;