#!/usr/local/bin/tclsh
# $Id: matrix.tcl,v 1.6 2001/01/16 00:34:18 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 avoid matrix size checks
# --Doug
# additional speedups by Kristoffer Lawson and Miguel Sofer
set size 30;
proc mkmatrix {rows cols} {
set count 1;
set mx [list]
for { set i 0 } { $i < $rows } { incr i } {
set row [list]
for { set j 0 } { $j < $cols } { incr j } {
lappend row $count;
incr count;
}
lappend mx $row;
}
return $mx;
}
proc mmult {m1 m2} {
set cols [lindex $m2 0]
foreach row1 $m1 {
set row [list]
set i 0
foreach - $cols {
set elem 0
foreach elem1 $row1 row2 $m2 {
set elem [expr {$elem + $elem1 * [lindex $row2 $i]}]
}
lappend row $elem
incr i
}
lappend result $row
}
return $result
}
proc main {} {
global argv size
set num [lindex $argv 0]
if {$num < 1} {
set num 1
}
set m1 [mkmatrix $size $size]
set m2 [mkmatrix $size $size]
while {$num > 0} {
incr num -1
set m [mmult $m1 $m2]
}
puts "[lindex [lindex $m 0] 0] [lindex [lindex $m 2] 3] [lindex [lindex $m 3] 2] [lindex [lindex $m 4] 4]"
}
main