#!/usr/local/bin/guile \ -e main -s !# ;;; $Id: matrix.guile,v 1.6 2001/06/29 23:12:37 doug Exp $ ;;; http://www.bagley.org/~doug/shootout/ ;;; with help from Brad Knotwell (define size 30) (define (mkmatrix rows cols) (define count 1) (define (set-row cols) (let ((row (make-vector cols 0))) (do ((i 0 (1+ i))) ((= i cols) row) (begin (vector-set! row i count) (set! count (1+ count)))))) (let ((mx (make-vector rows cols))) (begin (array-map-in-order! mx set-row mx) mx))) (define (mmult rows cols m1 m2) (let ((m3 (make-vector rows 0))) (do ((i 0 (+ i 1))) ((= i rows)) (let ((m1i (vector-ref m1 i)) (row (make-vector cols 0))) (do ((j 0 (+ j 1))) ((= j cols)) (let ((val 0)) (do ((k 0 (+ k 1))) ((= k cols)) (set! val (+ val (* (vector-ref m1i k) (vector-ref (vector-ref m2 k) j))))) (vector-set! row j val))) (vector-set! m3 i row))) m3)) (define (main args) (let ((n (or (and (= (length args) 2) (string->number (cadr args))) 1)) (m1 (mkmatrix size size)) (m2 (mkmatrix size size)) (mm 0)) (do ((i 0 (1+ i))) ((= i n) (begin (display (vector-ref (vector-ref mm 0) 0)) (display " ") (display (vector-ref (vector-ref mm 2) 3)) (display " ") (display (vector-ref (vector-ref mm 3) 2)) (display " ") (display (vector-ref (vector-ref mm 4) 4)) (newline))) (set! mm (mmult size size m1 m2)))))