ublasTools.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef __UBLAS_TOOLS_H__
00027 #define __UBLAS_TOOLS_H__
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <boost/numeric/ublas/vector.hpp>
00038 #include <boost/numeric/ublas/vector_proxy.hpp>
00039 #include <boost/numeric/ublas/matrix.hpp>
00040 #include <boost/numeric/ublas/triangular.hpp>
00041 #include <boost/numeric/ublas/lu.hpp>
00042 #include <boost/numeric/ublas/io.hpp>
00043 namespace ublas = boost::numeric::ublas;
00044
00045
00046
00047 template<class T>
00048 bool invert (const ublas::matrix<T>& input, ublas::matrix<T>& inverse) {
00049 using namespace boost::numeric::ublas;
00050 typedef permutation_matrix<std::size_t> pmatrix;
00051
00052 matrix<T> A(input);
00053
00054 pmatrix pm(A.size1());
00055
00056
00057 int res = lu_factorize(A,pm);
00058 if( res != 0 ) return false;
00059
00060
00061 inverse.assign(ublas::identity_matrix<T>(A.size1()));
00062
00063
00064 lu_substitute(A, pm, inverse);
00065
00066 return true;
00067 }
00068
00069 template<class T>
00070 boost::numeric::ublas::matrix<T>
00071 invert(const boost::numeric::ublas::matrix<T> &m, bool &is_singular)
00072 {
00073 ublas::matrix<T> inv_m (m.size1(), m.size2());
00074 is_singular = ! invert (m, inv_m);
00075 return inv_m;
00076 }
00077
00078 template<class matrix_T>
00079 double determinant(ublas::matrix_expression<matrix_T> const& mat_r) {
00080 double det = 1.0;
00081 matrix_T mLu(mat_r());
00082 ublas::permutation_matrix<std::size_t> pivots(mat_r().size1() );
00083 bool is_singular = lu_factorize(mLu, pivots);
00084 if (!is_singular) {
00085 for (std::size_t i = 0; i < pivots.size(); ++i) {
00086 if (pivots(i) != i) {
00087 det *= -1.0;
00088 }
00089 det *= mLu(i,i);
00090 }
00091 } else {
00092 det = 0.0;
00093 }
00094 return det;
00095 }
00096
00097 #endif
00098