QR decomposition: Difference between revisions

Added Racket version
(→‎{{header|J}}: improve link text)
(Added Racket version)
Line 1,293:
m <- lm(y ~ x + xx)
coef(m)</lang>
 
=={{header|Racket}}==
 
Racket has QR-decomposition builtin:
<lang racket>
> (require math)
> (matrix-qr (matrix [[12 -51 4]
[ 6 167 -68]
[-4 24 -41]]))
(array #[#[6/7 -69/175 -58/175] #[3/7 158/175 6/175] #[-2/7 6/35 -33/35]])
(array #[#[14 21 -14] #[0 175 -70] #[0 0 35]])
</lang>
 
The builtin QR-decomposition uses the Gram-Schmidt algorithm.
 
Here is an implementation of the Householder method:
<lang racket>
#lang racket
(require math/matrix math/array)
(define-values (T I col size)
(values ; short names
matrix-transpose identity-matrix matrix-col matrix-num-rows))
 
(define (scale c A) (matrix-scale A c))
(define (unit n i) (build-matrix n 1 (λ (j _) (if (= j i) 1 0))))
 
(define (H u)
(matrix- (I (size u))
(scale (/ 2 (matrix-dot u u))
(matrix* u (T u)))))
 
(define (normal a)
(define a0 (matrix-ref a 0 0))
(matrix- a (scale (* (sgn a0) (matrix-2norm a))
(unit (size a) 0))))
 
(define (QR A)
(define n (size A))
(for/fold ([Q (I n)] [R A]) ([i (- n 1)])
(define Hi (H (normal (submatrix R (:: i n) (:: i (+ i 1))))))
(define Hi* (if (= i 0) Hi (block-diagonal-matrix (list (I i) Hi))))
(values (matrix* Q Hi*) (matrix* Hi* R))))
 
(QR (matrix [[12 -51 4]
[ 6 167 -68]
[-4 24 -41]]))
</lang>
Output:
<lang racket>
(array #[#[6/7 69/175 -58/175]
#[3/7 -158/175 6/175]
#[-2/7 -6/35 -33/35]])
(array #[#[14 21 -14]
#[0 -175 70]
#[0 0 35]])
</lang>
 
=={{header|Rascal}}==
Anonymous user