16 #include <boost/numeric/ublas/vector.hpp> 17 #include <boost/numeric/ublas/vector_expression.hpp> 18 #include <boost/numeric/ublas/vector_proxy.hpp> 20 #include <boost/numeric/ublas/matrix.hpp> 21 #include <boost/numeric/ublas/matrix_expression.hpp> 22 #include <boost/numeric/ublas/matrix_proxy.hpp> 24 #include <boost/numeric/ublas/triangular.hpp> 30 using Vector = ublas::vector<double, std::vector<double>>;
31 using Matrix = ublas::matrix<double, ublas::row_major, std::vector<double>>;
32 using MatrixLower = ublas::triangular_matrix<double, ublas::lower, ublas::row_major, std::vector<double>>;
33 using MatrixUnitLower = ublas::triangular_matrix<double, ublas::unit_lower, ublas::row_major, std::vector<double>>;
43 template <
typename InputMatrix,
typename OutputTriangularMatrix>
46 using namespace ublas;
48 assert(A.size1() == A.size2());
49 assert(L.size1() == L.size2());
50 assert(A.size1() == L.size1());
52 const size_t n = A.size1();
54 for (
size_t k = 0; k < n; k++) {
56 double qL_kk = A(k, k)
57 - inner_prod(project(row(L, k), range(0, k)),
58 project(row(L, k), range(0, k)));
64 double L_kk = sqrt(qL_kk);
66 matrix_column<OutputTriangularMatrix> cLk(L, k);
68 project(cLk, range(k + 1, n)) = (project(column(A, k),
69 range(k + 1, n)) - prod(project(L, range(k + 1, n), range(0, k)),
70 project(row(L, k), range(0, k)))) / L_kk;
81 namespace boost {
namespace numeric {
namespace ublas {
83 template <
typename T,
typename A>
84 inline bool operator== (
const vector<T, A>& v1,
const vector<T, A>& v2)
86 return v1.data() == v2.data();
89 template <
typename T,
typename A>
90 inline bool operator!= (
const vector<T, A>& v1,
const vector<T, A>& v2)
92 return v1.data() != v2.data();
95 template <
typename T,
typename L,
typename A>
96 inline bool operator== (
const matrix<T, L, A>& m1,
const matrix<T, L, A>& m2)
98 return m1.data() == m2.data();
101 template <
typename T,
typename L,
typename A>
102 inline bool operator!= (
const matrix<T, L, A>& m1,
const matrix<T, L, A>& m2)
104 return m1.data() != m2.data();
107 template <
typename T,
typename TRI,
typename L,
typename A>
108 inline bool operator== (
const triangular_matrix<T, TRI, L, A>& m1,
const triangular_matrix<T, TRI, L, A>& m2)
110 return m1.data() == m2.data();
113 template <
typename T,
typename TRI,
typename L,
typename A>
114 inline bool operator!= (
const triangular_matrix<T, TRI, L, A>& m1,
const triangular_matrix<T, TRI, L, A>& m2)
116 return m1.data() != m2.data();
Definition: algorithm.cpp:28
size_t choleskyDecompose(const InputMatrix &A, OutputTriangularMatrix &L)
Decompose a symmetric positive definit matrix A into product L L^T.
Definition: blas.hpp:44