diff --git a/2_37.sch b/2_37.sch new file mode 100644 index 0000000..61024c3 --- /dev/null +++ b/2_37.sch @@ -0,0 +1,28 @@ +(define (accumulate op initial sequence) + (if (null? sequence) + initial + (op (car sequence) + (accumulate op initial (cdr sequence))))) + +(define (accumulate-n op init seqs) + (if (null? (car seqs)) + '() + (cons (accumulate op init (map car seqs)) + (accumulate-n op init (map cdr seqs))))) + +(define (dot-product v w) + (accumulate + 0 (map * v w))) + +(define (matrix-*-vector m v) + (map (lambda (row) (dot-product row v)) m)) + +(define (transpose m) + (accumulate-n cons '() m)) + +(define (matrix-*-matrix m n) + (let ((cols (transpose n))) + (map (lambda (row) + (map (lambda (col) + (dot-product row col)) + cols)) + m)))