www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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)))