-- iterated QR algorithm (see Golub and Van Loan, \"Matrix
-- Computations\").
--
+-- Warning: this may not converge if there are repeated eigenvalues
+-- (in magnitude).
+--
-- Examples:
--
-- >>> import Linear.Matrix ( Col2, Col3, Mat2, Mat3 )
=> Int
-> Mat (S m) (S m) a
-> Col (S m) a
-eigenvalues iterations matrix =
- diagonal (ut_approximation iterations)
- where
- ut_approximation :: Int -> Mat (S m) (S m) a
- ut_approximation 0 = matrix
- ut_approximation k = rk*qk where (qk,rk) = qr (ut_approximation (k-1))
+eigenvalues iterations matrix
+ | iterations < 0 = error "negative iterations requested"
+ | iterations == 0 = diagonal matrix
+ | otherwise =
+ diagonal (ut_approximation (iterations - 1))
+ where
+ ut_approximation :: Int -> Mat (S m) (S m) a
+ ut_approximation 0 = matrix
+ ut_approximation k = ut_next
+ where
+ ut_prev = ut_approximation (k-1)
+ (qk,rk) = qr ut_prev
+ ut_next = rk*qk
+
-- | Compute the eigenvalues and eigenvectors of a symmetric matrix
-- references see Goluv and Van Loan, \"Matrix Computations\", or
-- \"Calculation of Gauss Quadrature Rules\" by Golub and Welsch.
--
+-- Warning: this may not converge if there are repeated eigenvalues
+-- (in magnitude).
+--
-- Examples:
--
-- >>> import Linear.Matrix ( Col2, Col3, Mat2, Mat3 )
where
(t_prev, p_prev) = tp_pair (k-1)
(qk,rk) = qr t_prev
- tk = rk*qk
pk = p_prev*qk
-
+ tk = rk*qk
(values, vectors) = (first diagonal) (tp_pair iterations)