use flvectors in spectralnorm-unsafe

Add input info for spectralnorm-unsafe

svn: r17306
This commit is contained in:
Sam Tobin-Hochstadt 2009-12-15 16:26:47 +00:00
parent 145ed582b3
commit 3687048bbb
2 changed files with 13 additions and 11 deletions

View File

@ -36,6 +36,7 @@
("sieve.ss" "1200") ("sieve.ss" "1200")
("spellcheck.ss") ("spellcheck.ss")
("spectralnorm.ss" "5500") ("spectralnorm.ss" "5500")
("spectralnorm-unsafe.ss" "5500")
("strcat.ss" "40000") ("strcat.ss" "40000")
("sumcol.ss" #f ,(lambda () (mk-sumcol-input))) ("sumcol.ss" #f ,(lambda () (mk-sumcol-input)))
("wc.ss") ("wc.ss")

View File

@ -9,8 +9,8 @@
scheme/unsafe/ops) scheme/unsafe/ops)
(define (Approximate n) (define (Approximate n)
(let ([u (make-vector n 1.0)] (let ([u (make-flvector n 1.0)]
[v (make-vector n 0.0)]) [v (make-flvector n 0.0)])
;; 20 steps of the power method ;; 20 steps of the power method
(for ([i (in-range 10)]) (for ([i (in-range 10)])
(MultiplyAtAv n u v) (MultiplyAtAv n u v)
@ -21,9 +21,9 @@
(let loop ([i 0][vBv 0.0][vv 0.0]) (let loop ([i 0][vBv 0.0][vv 0.0])
(if (= i n) (if (= i n)
(sqrt (unsafe-fl/ vBv vv)) (sqrt (unsafe-fl/ vBv vv))
(let ([vi (unsafe-vector-ref v i)]) (let ([vi (unsafe-flvector-ref v i)])
(loop (unsafe-fx+ 1 i) (loop (unsafe-fx+ 1 i)
(unsafe-fl+ vBv (unsafe-fl* (unsafe-vector-ref u i) vi)) (unsafe-fl+ vBv (unsafe-fl* (unsafe-flvector-ref u i) vi))
(unsafe-fl+ vv (unsafe-fl* vi vi)))))))) (unsafe-fl+ vv (unsafe-fl* vi vi))))))))
;; return element i,j of infinite matrix A ;; return element i,j of infinite matrix A
@ -39,22 +39,22 @@
;; multiply vector v by matrix A ;; multiply vector v by matrix A
(define (MultiplyAv n v Av) (define (MultiplyAv n v Av)
(for ([i (in-range n)]) (for ([i (in-range n)])
(unsafe-vector-set! Av i (unsafe-flvector-set! Av i
(for/fold ([r 0.0]) (for/fold ([r 0.0])
([j (in-range n)]) ([j (in-range n)])
(unsafe-fl+ r (unsafe-fl* (A i j) (unsafe-vector-ref v j))))))) (unsafe-fl+ r (unsafe-fl* (A i j) (unsafe-flvector-ref v j)))))))
;; multiply vector v by matrix A transposed ;; multiply vector v by matrix A transposed
(define (MultiplyAtv n v Atv) (define (MultiplyAtv n v Atv)
(for ([i (in-range n)]) (for ([i (in-range n)])
(unsafe-vector-set! Atv i (unsafe-flvector-set! Atv i
(for/fold ([r 0.0]) (for/fold ([r 0.0])
([j (in-range n)]) ([j (in-range n)])
(unsafe-fl+ r (unsafe-fl* (A j i) (unsafe-vector-ref v j))))))) (unsafe-fl+ r (unsafe-fl* (A j i) (unsafe-flvector-ref v j)))))))
;; multiply vector v by matrix A and then by matrix A transposed ;; multiply vector v by matrix A and then by matrix A transposed
(define (MultiplyAtAv n v AtAv) (define (MultiplyAtAv n v AtAv)
(let ([u (make-vector n 0.0)]) (let ([u (make-flvector n 0.0)])
(MultiplyAv n v u) (MultiplyAv n v u)
(MultiplyAtv n u AtAv))) (MultiplyAtv n u AtAv)))
@ -62,3 +62,4 @@
(real->decimal-string (real->decimal-string
(Approximate (command-line #:args (n) (string->number n))) (Approximate (command-line #:args (n) (string->number n)))
9)) 9))