Perl, Tcl und Co


Hier: eine Matrizenmultiplikation

Perl:
sub mmult { my ($m1,$m2) = @_;
	my ($m1rows,$m1cols) = (scalar @$m1, scalar @{$m1->[0]});
	my ($m2rows,$m2cols) = (scalar @$m2, scalar @{$m2->[0]});
	unless ($m1cols == $m2rows) {  # raise exception, actually
	    die "IndexError: matrices don't match: $m1cols != $m2rows";
	}
	my $result = [];
	my ($i, $j, $k);
	for $i (0 .. ($m1rows - 1 )) {
	    for $j (0 .. ($m2cols - 1 )) {
		for $k ( 0 .. ($m1cols - 1)) {
		    $result->[$i]->[$j] += $m1->[$i]->[$k] * $m2->[$k]->[$j];
		}
	    }
	}
	return $result;
}

TCL:
mmult {m1 m2} {
    set m2rows [llength $m2];
    set m2cols [llength [lindex $m2 0]];
    set m1rows [llength $m1];
    set m1cols [llength [lindex $m1 0]];
    if { $m1cols != $m2rows || $m1rows != $m2cols } {
        error "Matrix dimensions do not match!";
    }
    foreach row1 $m1 {
        set row {};
        for { set i 0 }
 { $i < $m2cols } { incr i } {
            set j 0;
            set element 0;
            foreach row2 $m2 {
                incr element [expr [lindex $row1 $j] * [lindex $row2 $i]];
                incr j;
            }
            lappend row $element;
        }
        lappend result $row;
    }
    return $result;
}

Python:
def mmult(m1,m2):
      m2rows,m2cols = len(m2),len(m2[0])
      m1rows,m1cols = len(m1),len(m1[0])
      if m1cols != m2rows: raise IndexError, "matrices don't match"
      result = [ None ] * m1rows
      for i in range( m1rows ):
          result[i] = [0] * m2cols
          for j in range( m2cols ):
             for k in range( m1cols ):
                result[i][j] = result[i][j] + m1[i][k] * m2[k][j]
      return result