matrix.mlish (2002B)
1 #lang s-exp "../../mlish.rkt" 2 (require "../rackunit-typechecking.rkt") 3 4 (define-type-alias Matrix (Vector (Vector Int))) 5 6 (define size 30) 7 8 (define (vector-map [f : (→ X Y)] [v : (Vector X)] -> (Vector Y)) 9 (for/vector ([x (in-vector v)]) (f x))) 10 11 (define (mkmatrix [rows : Int] [cols : Int] -> Matrix) 12 (for/vector ([i (in-range rows)] 13 [count (in-range 1 (* rows cols) cols)]) 14 (for/vector ([j (in-range cols)] 15 [x (in-naturals count)]) 16 x))) 17 18 (check-type (mkmatrix 3 4) : Matrix 19 -> (vector (vector 1 2 3 4) 20 (vector 5 6 7 8) 21 (vector 9 10 11 12))) 22 23 (check-type (mkmatrix 3 3) 24 : Matrix 25 -> (vector (vector 1 2 3) 26 (vector 4 5 6) 27 (vector 7 8 9))) 28 29 (check-type (mkmatrix 4 3) 30 : Matrix 31 -> (vector (vector 1 2 3) 32 (vector 4 5 6) 33 (vector 7 8 9) 34 (vector 10 11 12))) 35 36 (define (num-cols [mx : Matrix] -> Int) 37 (let ((row (vector-ref mx 0))) 38 (vector-length row))) 39 40 (define (num-rows [mx : Matrix] -> Int) 41 (vector-length mx)) 42 43 (define (vec-mult [v1 : (Vector Int)] [v2 : (Vector Int)] -> Int) 44 (for/sum ([x (in-vector v1)] 45 [y (in-vector v2)]) 46 (* x y))) 47 48 (define (mmult [m1 : Matrix] [m2 : Matrix] -> Matrix) 49 (for/vector ([row (in-vector m1)]) 50 (for/vector ([col-num (in-range (num-cols m2))]) 51 (let ([col 52 (vector-map 53 (λ ([r : (Vector Int)]) (vector-ref r col-num)) 54 m2)]) 55 (vec-mult row col))))) 56 57 (check-type (mmult (mkmatrix 3 3) (mkmatrix 3 3)) 58 : Matrix 59 -> (vector (vector 30 36 42) 60 (vector 66 81 96) 61 (vector 102 126 150))) 62 63 (check-type (mmult (mkmatrix 2 3) (mkmatrix 3 2)) 64 : Matrix 65 -> (vector (vector 22 28) 66 (vector 49 64))) 67 68 (check-type (mmult (mkmatrix 4 3) (mkmatrix 3 4)) 69 : Matrix 70 -> (vector (vector 38 44 50 56) 71 (vector 83 98 113 128) 72 (vector 128 152 176 200) 73 (vector 173 206 239 272)))