1 #ifndef _RHEOLEF_UBLAS_INVERT_H
2 #define _RHEOLEF_UBLAS_INVERT_H
4 #include <boost/numeric/ublas/vector.hpp>
5 #include <boost/numeric/ublas/vector_proxy.hpp>
6 #include <boost/numeric/ublas/matrix.hpp>
7 #include <boost/numeric/ublas/triangular.hpp>
8 #include <boost/numeric/ublas/lu.hpp>
9 #include <boost/numeric/ublas/io.hpp>
10 namespace ublas = boost::numeric::ublas;
14 bool invert (
const ublas::matrix<T>& input, ublas::matrix<T>& inverse) {
15 using namespace boost::numeric::ublas;
16 typedef permutation_matrix<std::size_t> pmatrix;
18 pmatrix pm(A.size1());
20 int res = lu_factorize(A,pm);
21 if( res != 0 )
return false;
23 inverse.assign(ublas::identity_matrix<T>(A.size1()));
25 lu_substitute(A, pm, inverse);
30 boost::numeric::ublas::matrix<T>
31 invert(
const boost::numeric::ublas::matrix<T> &m,
bool &is_singular)
33 ublas::matrix<T> inv_m (m.size1(), m.size2());
34 is_singular = !
invert (m, inv_m);
38 template<
class matrix_T>
39 double determinant(ublas::matrix_expression<matrix_T>
const& mat_r) {
41 matrix_T mLu(mat_r());
42 ublas::permutation_matrix<std::size_t> pivots(mat_r().size1() );
43 bool is_singular = lu_factorize(mLu, pivots);
45 for (std::size_t i = 0; i < pivots.size(); ++i) {
57 #endif // _RHEOLEF_UBLAS_INVERT_H