/*============================================================================= File: matrix.cpp Purpose: Revision: $Id: matrix_complex.cpp,v 1.3 2002/05/24 17:08:34 philosophil Exp $ Created by: Philippe Lavoie (3 Oct, 1996) Modified by: Copyright notice: Copyright (C) 1996-1998 Philippe Lavoie This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. =============================================================================*/ #include "matrix.cpp" namespace PLib { double Matrix::norm(void){ int i,j ; double sumR, sumI, maxsum; int init=0 ; Complex *ptr ; ptr = m-1 ; maxsum = -1 ; // shuts up the warning messages for(i=0;i(sumR+sumI)) ? maxsum : (sumR+sumI); else{ maxsum = (sumR+sumI) ; init = 1; } ++ptr ; } return sqrt(maxsum); } template <> Matrix operator*(const double d, const Matrix &a) { int i, size=a.rows()*a.cols() ; Matrix b(a.rows(),a.cols()); Complex *bptr,*aptr ; bptr = b.m - 1 ; aptr = a.m - 1 ; for (i = size; i > 0 ; --i) *(++bptr) = (Complex)(d * (*(++aptr))) ; return b; } template <> Matrix operator*(const Complex &d, const Matrix &a) { int i, size=a.rows()*a.cols() ; Matrix b(a.rows(),a.cols()); Complex *bptr,*aptr ; bptr = b.m - 1 ; aptr = a.m - 1 ; for (i = size; i > 0 ; --i) *(++bptr) = d * *(++aptr) ; return b; } template <> Matrix Matrix::herm() const { int i, j, r = cols(), c = rows(); Matrix adj(r,c); for (i = 0; i < r; ++i) for (j = 0; j < c; ++j) adj.elem(i,j) = conj(elem(j,i)) ; return adj; } #ifdef NO_IMPLICIT_TEMPLATES // Complex instantation template class Matrix ; template Matrix operator+(const Matrix&,const Matrix&); template Matrix operator-(const Matrix&,const Matrix&); template Matrix operator*(const Matrix&,const Matrix&); template Vector operator*(const Matrix&,const Vector&); template int operator==(const Matrix&,const Matrix&); // template int operator!=(const Matrix&,const Matrix&); template Matrix comm(const Matrix&,const Matrix&); #endif }