/*! dgematrix*_dssmatrix operator */ inline _dgematrix operator*(const dgematrix& matA, const _dssmatrix& matB) { #ifdef CPPL_VERBOSE std::cerr << "# [MARK] operator*(const dgematrix&, const _dssmatrix&)" << std::endl; #endif//CPPL_VERBOSE #ifdef CPPL_DEBUG if(matA.N!=matB.M){ std::cerr << "[ERROR] operator*(const dgematrix&, const _dssmatrix&)" << std::endl << "These two matrises can not make a product." << std::endl << "Your input was (" << matA.M << "x" << matA.N << ") * (" << matB.N << "x" << matB.N << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG dgematrix newmat(matA.M, matB.N); newmat.zero(); for(long c=0; c<matB.VOL; c++){ for(long i=0; i<matA.M; i++){ newmat(i,matB.Jndx[c]) += matA(i,matB.Indx[c])*matB.Array[c]; } } matB.destroy(); return _(newmat); }
/*! dgematrix-_dssmatrix operator */ inline _dgematrix operator-(const dgematrix& matA, const _dssmatrix& matB) { #ifdef CPPL_VERBOSE std::cerr << "# [MARK] operator-(const dgematrix&, const _dssmatrix&)" << std::endl; #endif//CPPL_VERBOSE #ifdef CPPL_DEBUG if(matA.M!=matB.M || matA.N!=matB.N){ std::cerr << "[ERROR] operator-(const dgematrix&, const _dssmatrix&)" << std::endl << "These two matrises can not make a subtraction." << std::endl << "Your input was (" << matA.M << "x" << matA.N << ") - (" << matB.N << "x" << matB.N << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG dgematrix newmat(matA); for(long c=0; c<matB.VOL; c++){ newmat(matB.Indx[c],matB.Jndx[c]) -= matB.Array[c]; } matB.destroy(); return _(newmat); }
/*! _dssmatrix*_dcovector operator */ inline _dcovector operator*(const _dssmatrix& mat, const _dcovector& vec) {VERBOSE_REPORT; #ifdef CPPL_DEBUG if(mat.n!=vec.l){ ERROR_REPORT; std::cerr << "These matrix and vector can not make a product." << std::endl << "Your input was (" << mat.n << "x" << mat.n << ") * (" << vec.l << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG dcovector newvec(mat.n); newvec.zero(); for(std::vector<dcomponent>::iterator it=mat.data.begin(); it!=mat.data.end(); it++){ newvec(it->i) +=it->v*vec(it->j); if(it->i!=it->j){ newvec(it->j) +=it->v*vec(it->i); } } mat.destroy(); vec.destroy(); return _(newvec); }
/*! _dgbmatrix-_dssmatrix operator */ inline _dgematrix operator-(const _dgbmatrix& matA, const _dssmatrix& matB) { #ifdef CPPL_VERBOSE std::cerr << "# [MARK] operator-(const _dgbmatrix&, const _dssmatrix&)" << std::endl; #endif//CPPL_VERBOSE #ifdef CPPL_DEBUG if(matA.N!=matB.N || matA.M!=matB.M){ std::cerr << "[ERROR] operator+(const _dgbmatrix&, const _dssmatrix&)" << std::endl << "These two matrises can not make a summation." << std::endl << "Your input was (" << matA.M << "x" << matA.N << ") + (" << matB.M << "x" << matB.N << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG dgematrix newmat(-matB); for(long i=0; i<matA.M; i++){ for(long j=max(0,i-matA.KL); j<min(matA.N,i+matA.KU+1); j++){ newmat(i,j)-=matA(i,j); } } matA.destroy(); matB.destroy(); return _(newmat); }
/*! make a shallow copy of the matrix\n This function is not designed to be used in project codes. */ inline void dssmatrix::shallow_copy(const _dssmatrix& mat) {VERBOSE_REPORT; data.clear(); line.clear(); n =mat.n; data.swap(mat.data); line.swap(mat.line); mat.nullify(); }
/*! search the index of element having the largest absolute value in 0-based numbering system */ inline void idamax(long& i, long& j, const _dssmatrix& mat) {VERBOSE_REPORT; std::vector<dcomponent>::const_iterator itx(mat.data.begin()); double vmax(0); for(std::vector<dcomponent>::const_iterator it=mat.data.begin(); it!=mat.data.end(); it++){ if(vmax < it->v){ vmax=fabs(it->v); itx=it; } } i=itx->i; j=itx->j; mat.destroy(); }
/*! return its largest absolute value */ inline double damax(const _dssmatrix& mat) {VERBOSE_REPORT; std::vector<dcomponent>::const_iterator itx(mat.data.begin()); double vmax(0); for(std::vector<dcomponent>::const_iterator it=mat.data.begin(); it!=mat.data.end(); it++){ if(vmax < it->v){ vmax=fabs(it->v); itx=it; } } double val(itx->v); mat.destroy(); return val; }