Tcl Matrix Type

1 minute read

I’ve just implemented a matrix object type for Tcl, the sources are available here (matrix0.1-src.zip). The package implements a new object type for Tcl which looks like a nested list of doubles but is stored internally as a 2d matrix. Conversion to and from string values is only done as needed so that matrices can be passed by value efficiently in tcl scripts. Here’s what you can do in Tcl with this package:

package require cmatrix 0.1
# make a big square matrix as a list of lists
set n 1000
for {set i 0} {$i < $n} {incr i} {
    set row {}
    for {set j 0} {$j < $n} {incr j} {
        lappend row [expr $j*$i]
    }
    lappend matrix $row
}

# add the matrix to itself, triggers conversion to matrix only once
puts sum:[time {set sum [cmatrix add $matrix $matrix]}]
# second time, no conversion needed
puts sum2:[time {set sum [cmatrix add $matrix $matrix]}]
# transpose this matrix
puts trans:[time {set trans [cmatrix transpose $sum]}]
# now get the first row of trans, triggers conversion from matrix
# back to list
puts lindex:[time {set row [lindex $trans 0]}]
 

Output from the above on my system is:

sum:1184447 microseconds per iteration
sum2:109284 microseconds per iteration
trans:191660 microseconds per iteration
lindex:3736227 microseconds per iteration
 

Of course there’s probably more to do here. Currently I don’t expose many matrix operations to the tcl level since originally this was meant as a C callable library. More can be added later. Comments are welcome.

Updated: