X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FLinear%2FQR.hs;h=a4fb325f96d4b510401f79d8517b6beb48b8fc79;hb=38b68b8c9b83fc7bc9c6a2c9535a50a904d20b08;hp=13782c4fa9073728bfdf5d4a0de8b4a2788a67e4;hpb=bd9c9a0bc058786a45a7f679e4037a4a814d79d8;p=numerical-analysis.git diff --git a/src/Linear/QR.hs b/src/Linear/QR.hs index 13782c4..a4fb325 100644 --- a/src/Linear/QR.hs +++ b/src/Linear/QR.hs @@ -140,11 +140,14 @@ givens_rotator i j xi xj = -- True -- qr :: forall m n a. (Arity m, Arity n, Eq a, Algebraic.C a, Ring.C a) - => Mat m n a -> (Mat m m a, Mat m n a) + => Mat (S m) (S n) a + -> (Mat (S m) (S m) a, Mat (S m) (S n) a) qr matrix = ifoldl col_function initial_qr columns where Mat columns = transpose matrix + + initial_qr :: (Mat (S m) (S m) a, Mat (S m) (S n) a) initial_qr = (identity_matrix, matrix) -- | Process the column and spit out the current QR @@ -155,14 +158,14 @@ qr matrix = ifoldl (f col_idx) (q,r) col -- | Process the entries in a column, doing basically the same - -- thing as col_dunction does. It updates the QR factorization, + -- thing as col_function does. It updates the QR factorization, -- maybe, and returns the current one. f col_idx (q,r) idx _ -- ignore the current element | idx <= col_idx = (q,r) -- leave it alone | otherwise = (q*rotator, (transpose rotator)*r) where y = r !!! (idx, col_idx) - rotator :: Mat m m a + rotator :: Mat (S m) (S m) a rotator = givens_rotator col_idx idx (r !!! (col_idx, col_idx)) y @@ -231,7 +234,7 @@ eigenvalues iterations matrix -- Examples: -- -- >>> import Linear.Matrix ( Col2, Col3, Mat2, Mat3 ) --- >>> import Linear.Matrix ( column', frobenius_norm, fromList ) +-- >>> import Linear.Matrix ( column, frobenius_norm, fromList ) -- >>> import Linear.Matrix ( identity_matrix, vec3d ) -- >>> import Normed ( Normed(..) ) -- @@ -253,11 +256,11 @@ eigenvalues iterations matrix -- >>> let v1 = (1 / (norm v1') :: Double) *> v1' -- >>> let v2' = vec3d (-4, -2, 5) :: Col3 Double -- >>> let v2 = (1 / (norm v2') :: Double) *> v2' --- >>> frobenius_norm ((column' vecs 0) - v0) < 1e-12 +-- >>> frobenius_norm ((column vecs 0) - v0) < 1e-12 -- True --- >>> frobenius_norm ((column' vecs 1) - v1) < 1e-12 +-- >>> frobenius_norm ((column vecs 1) - v1) < 1e-12 -- True --- >>> frobenius_norm ((column' vecs 2) - v2) < 1e-12 +-- >>> frobenius_norm ((column vecs 2) - v2) < 1e-12 -- True -- eigenvectors_symmetric :: forall m a. (Arity m, Algebraic.C a, Eq a)