// smatrix.h #ifndef smatrix_H #define smatrix_H #undef trf_info #define trf_error #include "nvector.h" template class matrix; template class smatrix; template smatrix operator% (const matrix& mat, const smatrix& sma); template class smatrix : public array { private: int _nrow; int ij( int i, int j ) const { return i>j ? i*(i+1)/2+j : j*(j+1)/2+i ; }; void ostr(std::ostream& stream) const; public: explicit smatrix(int N) : array( N*(N+1)/2 ) { _nrow = N; }; smatrix(const smatrix& sma); virtual ~smatrix(void) { }; smatrix &operator=(const smatrix& sma); int nrow() const { return _nrow; }; T& operator()( int i, int j ) const { return data[ij(i,j)]; }; smatrix &operator+=(const smatrix& sma); smatrix &operator-=(const smatrix& sma); smatrix &operator*=(const T& tval); #if defined(DEFECT_GUIDING_DECLS) friend smatrix operator+(const smatrix& sma1, const smatrix& sma2); friend smatrix operator-(const smatrix& sma1, const smatrix& sma2); friend smatrix operator%(const matrix& mat, const smatrix& sma); #elif defined(DEFECT_NO_EXPLICIT_QUALIFICATION) template friend smatrix operator+(const smatrix& sma1, const smatrix& sma2); template friend smatrix operator-(const smatrix& sma1, const smatrix& sma2); template friend smatrix operator%(const matrix& mat, const smatrix& sma); #else friend smatrix operator+ <> (const smatrix& sma1, const smatrix& sma2); friend smatrix operator- <> (const smatrix& sma1, const smatrix& sma2); friend smatrix operator% <> (const matrix& mat, const smatrix& sma); #endif }; template void normalize(smatrix& sma); // copy template inline smatrix::smatrix(const smatrix& sma) : array(sma) { #ifdef trf_info std::cout << "copying a symmetric matrix\n"; #endif _nrow = sma._nrow; } // assignment template inline smatrix &smatrix::operator=(const smatrix& sma) { #ifdef trf_info std::cout << "assigning a symmetric matrix\n"; #endif (array&)*this = sma; _nrow = sma._nrow; return *this; } // inversion extern int invert( smatrix& sma ); // need to add code for dim>1 /* template smatrix smatrix::invert( ) { smatrix sma(_nrow); if ( _nrow == 1 ) sma(0,0) = 1.0/data[0]; else fill( T(0) ); return sma; } */ // += template inline smatrix &smatrix::operator+=(const smatrix& sma) { (array&)*this += sma; return *this; } // -= template inline smatrix &smatrix::operator-=(const smatrix& sma) { (array&)*this -= sma; return *this; } // *= template inline smatrix &smatrix::operator*=(const T& t) { (array&)*this *= t; return *this; } template inline smatrix operator*(const T& val,const smatrix& sma) { smatrix lhs = sma; lhs *= val; return lhs; } template inline smatrix operator*(const smatrix& sma,const T& val) { smatrix lhs = sma; lhs *= val; return lhs; } // + template inline smatrix operator+(const smatrix& sma1,const smatrix& sma2) { smatrix sum = sma1; sum += sma2; return sum; } // - template inline smatrix operator-(const smatrix& sma1,const smatrix& sma2) { smatrix sum = sma1; sum -= sma2; return sum; } // // // multiplication: t = S % v == vT * S * v // template T operator%(const smatrix& sma, const nvector& vec); #ifndef __xlC__ #include "smatrix.c" #endif #endif