#!/usr/local/bin/perl
# $Id: matrix.perl,v 1.1 2000/12/29 06:10:10 doug Exp $
# http://www.bagley.org/~doug/shootout/
# This program based on the original from:
# "The What, Why, Who, and Where of Python" By Aaron R. Watters
# http://www.networkcomputing.com/unixworld/tutorial/005/005.html
# modified to pass rows and cols, and avoid matrix size checks
# I've sped up the original quite a bit by removing some loop
# invariants and declaring "use integer"
use strict;
use integer;
my $size = 30;
sub mkmatrix {
my($rows, $cols) = @_;
--$rows; --$cols;
my $count = 1;
my @mx = ();
foreach (0 .. $rows) {
my @row = ();
$row[$_] = $count++ foreach (0 .. $cols);
push(@mx, \@row);
}
return(\@mx);
}
# mmult contributed by Tony Bowden
sub mmult {
my ($rows, $cols, $m1, $m2) = @_;
my $m3 = [];
--$rows; --$cols;
for my $i (0 .. $rows) {
for my $j (0 .. $cols) {
$m3->[$i][$j] += $m1->[$i][$_] * $m2->[$_][$j] for 0..$cols;
}
}
return $m3;
}
#sub mmult {
# my ($rows, $cols, $m1, $m2) = @_;
# my @m3 = ();
# --$rows; --$cols;
# for my $i (0 .. $rows) {
# my @row = ();
# my $m1i = $m1->[$i];
# for my $j (0 .. $cols) {
# my $val = 0;
# for my $k (0 .. $cols) {
# $val += $m1i->[$k] * $m2->[$k]->[$j];
# }
# push(@row, $val);
# }
# push(@m3, \@row);
# }
# return(\@m3);
#}
my $N = $ARGV[0] || 1;
my $m1 = mkmatrix($size, $size);
my $m2 = mkmatrix($size, $size);
my $mm;
while ($N--) {
$mm = mmult($size, $size, $m1, $m2);
}
print "$mm->[0]->[0] $mm->[2]->[3] $mm->[3]->[2] $mm->[4]->[4]\n";