racket/collects/math/private/vector/vector-mutate.rkt
Neil Toronto 3bc4c1ffdc More efficient Gaussian elimination using vectors of vectors (non-strict
arrays can't help an inherently sequential algorithm)
2012-12-21 22:59:59 -07:00

48 lines
1.6 KiB
Racket

#lang typed/racket/base
(require racket/fixnum
math/private/unsafe)
(provide vector-swap!
vector-scale!
vector-scaled-add!)
(: vector-swap! (All (A) ((Vectorof A) Integer Integer -> Void)))
(define (vector-swap! vs i0 i1)
(unless (= i0 i1)
(define tmp (unsafe-vector-ref vs i0))
(unsafe-vector-set! vs i0 (unsafe-vector-ref vs i1))
(unsafe-vector-set! vs i1 tmp)))
(define-syntax-rule (vector-generic-scale! vs-expr v-expr *)
(let* ([vs vs-expr]
[v v-expr]
[n (vector-length vs)])
(let loop ([#{i : Nonnegative-Fixnum} 0])
(if (i . fx< . n)
(begin (unsafe-vector-set! vs i (* v (unsafe-vector-ref vs i)))
(loop (fx+ i 1)))
(void)))))
(: vector-scale! (case-> ((Vectorof Real) Real -> Void)
((Vectorof Number) Number -> Void)))
(define (vector-scale! vs v)
(vector-generic-scale! vs v *))
(define-syntax-rule (vector-generic-scaled-add! vs0-expr vs1-expr v-expr + *)
(let* ([vs0 vs0-expr]
[vs1 vs1-expr]
[v v-expr]
[n (min (vector-length vs0) (vector-length vs1))])
(let loop ([#{i : Nonnegative-Fixnum} 0])
(if (i . fx< . n)
(begin (unsafe-vector-set! vs0 i (+ (unsafe-vector-ref vs0 i)
(* (unsafe-vector-ref vs1 i) v)))
(loop (fx+ i 1)))
(void)))))
(: vector-scaled-add! (case-> ((Vectorof Real) (Vectorof Real) Real -> Void)
((Vectorof Number) (Vectorof Number) Number -> Void)))
(define (vector-scaled-add! v0 v1 s)
(vector-generic-scaled-add! v0 v1 s + *))