#ifndef DMATRIX_HXX #define DMATRIX_HXX #include #include namespace GMapping { class DNotInvertibleMatrixException: public std::exception {}; class DIncompatibleMatrixException: public std::exception {}; class DNotSquareMatrixException: public std::exception {}; template class DMatrix { public: DMatrix(int n=0,int m=0); ~DMatrix(); DMatrix(const DMatrix&); DMatrix& operator=(const DMatrix&); X * operator[](int i) { if ((*shares)>1) detach(); return mrows[i]; } const X * operator[](int i) const { return mrows[i]; } const X det() const; DMatrix inv() const; DMatrix transpose() const; DMatrix operator*(const DMatrix&) const; DMatrix operator+(const DMatrix&) const; DMatrix operator-(const DMatrix&) const; DMatrix operator*(const X&) const; int rows() const { return nrows; } int columns() const { return ncols; } void detach(); static DMatrix I(int); protected: int nrows,ncols; X * elems; X ** mrows; int * shares; }; template DMatrix::DMatrix(int n,int m) { if (n<1) n=1; if (m<1) m=1; nrows=n; ncols=m; elems=new X[nrows*ncols]; mrows=new X* [nrows]; for (int i=0;i DMatrix::~DMatrix() { if (--(*shares)) return; delete [] elems; delete [] mrows; delete shares; } template DMatrix::DMatrix(const DMatrix& m) { shares=m.shares; elems=m.elems; nrows=m.nrows; ncols=m.ncols; mrows=m.mrows; (*shares)++; } template DMatrix& DMatrix::operator=(const DMatrix& m) { if (!--(*shares)) { delete [] elems; delete [] mrows; delete shares; } shares=m.shares; elems=m.elems; nrows=m.nrows; ncols=m.ncols; mrows=m.mrows; (*shares)++; return *this; } template DMatrix DMatrix::inv() const { if (nrows!=ncols) throw DNotInvertibleMatrixException(); DMatrix aux1(*this),aux2(I(nrows)); aux1.detach(); for (int i=0;i=nrows) throw DNotInvertibleMatrixException(); X val=aux1.mrows[k][i]; for (int j=0;j const X DMatrix::det() const { if (nrows!=ncols) throw DNotSquareMatrixException(); DMatrix aux(*this); X d=X(1); aux.detach(); for (int i=0;i=nrows) return X(0); X val=aux.mrows[k][i]; for (int j=0;j DMatrix DMatrix::transpose() const { DMatrix aux(ncols, nrows); for (int i=0; i DMatrix DMatrix::operator*(const DMatrix& m) const { if (ncols!=m.nrows) throw DIncompatibleMatrixException(); DMatrix aux(nrows,m.ncols); for (int i=0;i DMatrix DMatrix::operator+(const DMatrix& m) const { if (ncols!=m.ncols||nrows!=m.nrows) throw DIncompatibleMatrixException(); DMatrix aux(nrows,ncols); for (int i=0;i DMatrix DMatrix::operator-(const DMatrix& m) const { if (ncols!=m.ncols||nrows!=m.nrows) throw DIncompatibleMatrixException(); DMatrix aux(nrows,ncols); for (int i=0;i DMatrix DMatrix::operator*(const X& e) const { DMatrix aux(nrows,ncols); for (int i=0;i void DMatrix::detach() { DMatrix aux(nrows,ncols); for (int i=0;i DMatrix DMatrix::I(int n) { DMatrix aux(n,n); for (int i=0;i std::ostream& operator<<(std::ostream& os, const DMatrix &m) { os << "{"; for (int i=0;i0) os << ","; os << "{"; for (int j=0;j0) os << ","; os << m[i][j]; } os << "}"; } return os << "}"; } }; //namespace GMapping #endif