mult.h

Go to the documentation of this file.
00001 #ifndef __mult_h
00002 #define __mult_h
00003 
00004 #include "gascoignemath.h"
00005 
00006 namespace Gascoigne
00007 {
00008 template<class MATRIX1, class MATRIX2, class MATRIX3>
00009 void multeq(MATRIX1& M, const MATRIX2& A, const MATRIX3& B)
00010 {
00011   typename MATRIX1::iterator         p  = M.begin();
00012   typename MATRIX2::const_iterator   Ap = A.begin();
00013   typename MATRIX3::const_iterator   Bp;
00014   
00015   int m  = M.m();
00016   int ma = A.m();
00017   int mb = B.m();
00018   int nb = B.n();
00019   
00020   while(p!=M.end())
00021     {
00022       for(int j=0;j<m;j++)
00023         {
00024           Bp = B.begin()+j;
00025           *p = 0.;
00026           for(int k=0;k<nb;k++)
00027             {
00028               *p += (*Ap++) * (*Bp);
00029               Bp += mb;
00030             }
00031           p++;
00032           Ap -= nb;
00033         }
00034       Ap += ma;
00035     }
00036 }
00037 
00038 template<class MATRIX, class VECTOR>
00039 void vmult(VECTOR& y, const MATRIX& M, const VECTOR& x)
00040 {
00041   typename VECTOR::iterator         py = y.begin();
00042   typename VECTOR::const_iterator   px;
00043   typename MATRIX::const_iterator   p = M.begin();
00044 
00045   while(p!=M.end())
00046     {
00047       px = x.begin();
00048       for(int j=0;j<M.m();j++)
00049         {
00050           *py += (*p++) * (*px++);
00051         }
00052       py++;
00053     }
00054 }
00055 
00056 template<class MATRIX, class VECTOR1, class VECTOR2>
00057 void vmulteq(VECTOR1& y, const MATRIX& M, const VECTOR2& x)
00058 {
00059   typename VECTOR1::iterator         py = y.begin();
00060   typename VECTOR2::const_iterator   px;
00061   typename MATRIX::const_iterator   p = M.begin();
00062 
00063   while(p!=M.end())
00064     {
00065       px = x.begin();
00066       *py = 0.;
00067       for(int j=0;j<M.m();j++)
00068         {
00069           *py += (*p++) * (*px++);
00070         }
00071       py++;
00072     }
00073 }
00074 
00075 template<class MATRIX, class ITERATOR, class CITERATOR>
00076 void vmulteq2(ITERATOR& py, const MATRIX& M, CITERATOR& px0)
00077 {
00078   CITERATOR                         px;
00079   typename MATRIX::const_iterator   p = M.begin();
00080 
00081   while(p!=M.end())
00082     {
00083       px = px0;
00084       *py = 0.;
00085       for(int j=0;j<M.m();j++)
00086         {
00087           *py += (*p++) * (*px++);
00088         }
00089       py++;
00090     }
00091 }
00092 
00093 template<class MATRIX, class CITERATOR>
00094 double norme(const MATRIX& M, CITERATOR px0)
00095 {
00096   double d = 0.;
00097   typename MATRIX::const_iterator   p = M.begin();
00098 
00099   CITERATOR px,py=px0;
00100   while(p!=M.end())
00101     {
00102       px = px0;
00103       for(int j=0;j<M.m();j++)
00104         {
00105           d += (*py) * (*p++) * (*px++);
00106         }
00107       py++;
00108     }
00109   return d;
00110 }
00111 
00112 template<class MATRIX, class VECTOR>
00113 void backward(VECTOR& dst, const MATRIX& M, const VECTOR& src)
00114     {
00115       int i,j;
00116       int nu = min_int(M.m(),M.n());
00117       double s;
00118       for (i=nu-1;i>=0;i--)
00119         {
00120           s = src[i];
00121           for (j=i+1;j<nu;j++) s -= dst[j] * M(i,j);
00122           dst[i] = s/M(i,i);
00123         }
00124     }
00125 }
00126 
00127 #endif
00128 

Generated on Thu Sep 14 10:34:35 2006 for Gascoigne by  doxygen 1.4.7