module Math.LinearAlgebra.GramSchmidt (
gramSchmidtBasis,
gramSchmidtOrthogonalization
) where
import Prelude hiding ((*>))
import Math.Algebra.LinearAlgebra
gramSchmidtBasis :: Fractional a => [[a]] -> [[a]]
gramSchmidtBasis a = fst $ gramSchmidtOrthogonalization a
gramSchmidtOrthogonalization :: Fractional a => [[a]] -> ([[a]], [[a]])
gramSchmidtOrthogonalization (b0:bs) = gs bs [b0] []
gs [] b' mu = (b', mu)
gs (b_i:bs) b' mu = gs bs b'' mu'
where
mu_i = mu_row b' b_i
mu' = mu ++ [mu_i]
tosum = zipWith (*>) mu_i b'
offset = foldl1 (<+>) tosum
b'_i = b_i <-> offset
b'' = b' ++ [b'_i]
mu_row b' b_i = flip map b' $ \b'_j -> (b_i <.> b'_j) / (b'_j <.> b'_j)