// matrix.c #ifndef matrix_C #define matrix_C #include "matrix.h" #include "trfutil/trfstream.h" // output stream template void matrix::ostr(std::ostream& stream) const { stream << begin_object; int i = 0; for ( int irow=0; irow 0 ) stream << ' '; stream << data[i++]; } } stream << end_object; } // // conversion from symmetric matrix to matrix // template matrix::matrix(const smatrix& sma) : array(sma.nrow()*sma.nrow()) { _nrow = sma.nrow(); _ncol = sma.nrow(); for ( int irow=0; irow<_nrow; irow++ ) { for ( int icol=0; icol<_ncol; icol++ ) { data[ij(irow,icol)] = sma(irow,icol); } } } // // mutiplication: matrix*matrix // template matrix operator*(const matrix& mat1,const matrix& mat2) { if ( mat1.ncol() != mat2.nrow() ) { matrix prod(0,0); return prod; } int nrow = mat1.nrow(); int ncol = mat2.ncol(); matrix prod(nrow,ncol); for ( int row=0; row matrix operator*(const smatrix& sma1,const smatrix& sma2) { if ( sma1.nrow() != sma2.nrow() ) { std::cerr << "operator*(sma,sma): nrow != ncol\n" << flush; matrix prod(0,0); return prod; } int nrow = sma1.nrow(); matrix prod(nrow,nrow); for ( int row=0; row nvector operator*(const matrix& mat1,const nvector& vec2) { if ( mat1.ncol() != vec2.length() ) { nvector prod(0); return prod; } nvector prod( mat1.nrow() ); for ( int row=0; row smatrix operator%(const matrix& mat, const smatrix& sma) { if ( mat.ncol() != sma.nrow() ) { smatrix prod(0); return prod; } int dim1 = mat.ncol(); int dim2 = mat.nrow(); smatrix prod( dim2 ); if (dim2 == 1) { // N=1 case. T* smdata = sma.data; T* matdata = mat.data; int ii = 0; T sum = 0; for (int j=0; j