23 #ifndef _H_CHOLESKY_HPP_
24 #define _H_CHOLESKY_HPP_
28 #include <boost/numeric/ublas/vector.hpp>
29 #include <boost/numeric/ublas/vector_proxy.hpp>
31 #include <boost/numeric/ublas/matrix.hpp>
32 #include <boost/numeric/ublas/matrix_proxy.hpp>
34 #include <boost/numeric/ublas/vector_expression.hpp>
35 #include <boost/numeric/ublas/matrix_expression.hpp>
37 #include <boost/numeric/ublas/triangular.hpp>
39 namespace ublas = boost::numeric::ublas;
50 template <
class MATRIX,
class TRIA >
53 using namespace ublas;
55 typedef typename MATRIX::value_type T;
57 assert( A.size1() == A.size2() );
58 assert( A.size1() == L.size1() );
59 assert( A.size2() == L.size2() );
61 const size_t n = A.size1();
63 for (
size_t k=0 ; k < n; k++) {
65 double qL_kk = A(k,k) - inner_prod( project( row(L, k), range(0, k) ),
66 project( row(L, k), range(0, k) ) );
71 double L_kk = sqrt( qL_kk );
74 matrix_column<TRIA> cLk(L, k);
75 project( cLk, range(k+1, n) )
76 = ( project( column(A, k), range(k+1, n) )
77 - prod( project(L, range(k+1, n), range(0, k)),
78 project(row(L, k), range(0, k) ) ) ) / L_kk;
92 template <
class MATRIX >
95 using namespace ublas;
97 typedef typename MATRIX::value_type T;
101 const size_t n = A.size1();
103 for (
size_t k=0 ; k < n; k++) {
105 double qL_kk = A_c(k,k) - inner_prod( project( row(A_c, k), range(0, k) ),
106 project( row(A_c, k), range(0, k) ) );
111 double L_kk = sqrt( qL_kk );
113 matrix_column<MATRIX> cLk(A, k);
114 project( cLk, range(k+1, n) )
115 = ( project( column(A_c, k), range(k+1, n) )
116 - prod( project(A_c, range(k+1, n), range(0, k)),
117 project(row(A_c, k), range(0, k) ) ) ) / L_kk;
125 using namespace ublas;
132 template<
class E1,
class E2>
133 void inplace_solve (
const matrix_expression<E1> &e1, vector_expression<E2> &e2,
134 lower_tag, column_major_tag) {
135 std::cout <<
" is_lc ";
136 typedef typename E2::size_type size_type;
137 typedef typename E2::difference_type difference_type;
138 typedef typename E2::value_type value_type;
140 BOOST_UBLAS_CHECK (e1 ().size1 () == e1 ().size2 (), bad_size ());
141 BOOST_UBLAS_CHECK (e1 ().size2 () == e2 ().size (), bad_size ());
142 size_type size = e2 ().size ();
143 for (size_type n = 0; n < size; ++ n) {
144 #ifndef BOOST_UBLAS_SINGULAR_CHECK
145 BOOST_UBLAS_CHECK (e1 () (n, n) != value_type(), singular ());
147 if (e1 () (n, n) == value_type())
148 singular ().raise ();
150 value_type t = e2 () (n) / e1 () (n, n);
152 if (t != value_type()) {
153 project( e2 (), range(n+1, size) )
154 .minus_assign( t * project( column( e1 (), n), range(n+1, size) ) );
171 template <
class MATRIX >
174 using namespace ublas;
176 typedef typename MATRIX::value_type T;
179 const MATRIX& A_c(A);
181 const size_t n = A.size1();
183 for (
size_t k=0 ; k < n; k++) {
185 double qL_kk = A_c(k,k) - inner_prod( project( row( A_c, k ), range(0, k) ),
186 project( row( A_c, k ), range(0, k) ) );
191 double L_kk = sqrt( qL_kk );
194 for (
size_t i = k+1; i < A.size1(); ++i) {
195 T* Aik = A.find_element(i, k);
198 *Aik = ( *Aik - inner_prod( project( row( A_c, k ), range(0, k) ),
199 project( row( A_c, i ), range(0, k) ) ) ) / L_kk;
218 template <
class TRIA,
class VEC >
222 using namespace ublas;
224 inplace_solve(L, x, lower_tag() );
225 inplace_solve(trans(L), x, upper_tag());
size_t cholesky_decompose(const MATRIX &A, TRIA &L)
decompose the symmetric positive definit matrix A into product L L^T.
Definition: cholesky.hpp:51
void cholesky_solve(const TRIA &L, VEC &x, ublas::lower)
solve system L L^T x = b inplace
Definition: cholesky.hpp:220
size_t incomplete_cholesky_decompose(MATRIX &A)
decompose the symmetric positive definit matrix A into product L L^T.
Definition: cholesky.hpp:172