X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flinal%2Fsquarematrix.h;h=b8531aafcb8359bcda6ea35628a9f561f77b677b;hb=fb1e198;hp=5117bb3fa189ee4339d0ce52cdbb4d2ff141b83b;hpb=e4b75401bd773201deb00eff672ee34794479671;p=libs%2Fmath.git diff --git a/source/linal/squarematrix.h b/source/linal/squarematrix.h index 5117bb3..b8531aa 100644 --- a/source/linal/squarematrix.h +++ b/source/linal/squarematrix.h @@ -2,19 +2,12 @@ #define MSP_LINAL_SQUAREMATRIX_H_ #include -#include #include "matrix.h" +#include "matrixops.h" namespace Msp { namespace LinAl { -class not_invertible: public std::domain_error -{ -public: - not_invertible(): domain_error(std::string()) { } - virtual ~not_invertible() throw() { } -}; - /** A mathematical matrix with S rows and columns. Some operations are provided here that are only possible for square matrices. @@ -53,49 +46,17 @@ SquareMatrix &SquareMatrix::operator*=(const SquareMatrix &m) template SquareMatrix &SquareMatrix::invert() { - using std::abs; - SquareMatrix r = identity(); - for(unsigned i=0; ielement(j, i))>abs(this->element(pivot, i))) - pivot = j; - - if(this->element(pivot, i)==T(0)) - throw not_invertible(); - - if(pivot!=i) - { - this->exchange_rows(i, pivot); - r.exchange_rows(i, pivot); - } - - for(unsigned j=i+1; jelement(j, i)/this->element(i, i); - this->add_row(i, j, a); - r.add_row(i, j, a); - } - - T a = T(1)/this->element(i, i); - this->multiply_row(i, a); - r.multiply_row(i, a); - } - - for(unsigned i=S; i-->0; ) - for(unsigned j=i; j-->0; ) - r.add_row(i, j, -this->element(j, i)); - + gauss_jordan(*this, r); return *this = r; } template inline SquareMatrix invert(const SquareMatrix &m) { - SquareMatrix r = m; - return r.invert(); + SquareMatrix temp = m; + SquareMatrix r = SquareMatrix::identity(); + return gauss_jordan(temp, r); } } // namespace LinAl