Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

matrix.inl

Go to the documentation of this file.
00001 /* --------------------------------------------------------------- *\
00002 
00003    file: matrix.inl
00004    date: 030825 22:16:28
00005 
00006    author:
00007 
00008       mathias gumz <gumz at cs.uni-magdeburg.de>
00009 
00010    license:
00011 
00012       see LICENSE.txt
00013 
00014    about:
00015 
00016       generic matrix class
00017 
00018 \* --------------------------------------------------------------- */
00019 
00020 
00021 /* --------------------------------------------------------------- *\
00022     definition of Mat
00023 \* --------------------------------------------------------------- */
00024 
00025 template<typename T, int W, int H>
00026 Mat<T, W, H>& Mat<T, W, H>::operator=(typename Mat<T, W, H>::ConstValType& scalar)
00027 {
00028   return matrix::assign(*this, scalar);
00029 }
00030 
00031 template<typename T, int W, int H> inline
00032 Mat<T, W, H>& Mat<T, W, H>::operator=(typename Mat<T, W, H>::ConstValTypePtr valptr)
00033 {
00034   return matrix::assign(*this, valptr);
00035 }
00036 
00037 template<typename T, int W, int H> inline
00038 Mat<T, W, H>& Mat<T, W, H>::operator=(typename Mat<T, W, H>::ConstMatType& mat)
00039 {
00040   return matrix::assign(*this, mat);
00041 }
00042 
00043 /* --------------------------------------------------------------- *\
00044 \* --------------------------------------------------------------- */
00045 
00046 template<typename T, int W, int H> inline
00047 Mat<T, W, H> Mat<T, W, H>::operator+(typename Mat<T, W, H>::ConstMatType& mat) const
00048 {
00049   Mat<T, W, H> m;
00050   for (int i= 0; i < W; i++ )
00051     m.val[i]= val[i] + mat.val[i];
00052 
00053   return m;
00054 };
00055 
00056 template<typename T, int W, int H> inline
00057 Mat<T, W, H>& Mat<T, W, H>::operator+=(typename Mat<T, W, H>::ConstMatType& mat)
00058 {
00059   for (int i= 0; i < W; i++ )
00060     val[i]+= mat.val[i];
00061   return *this;
00062 };
00063 
00064 template<typename T, int W, int H> inline
00065 Mat<T, W, H> Mat<T, W, H>::operator-(typename Mat<T, W, H>::ConstMatType& mat) const
00066 {
00067   Mat<T, W, H> m;
00068   for (int i= 0; i < W; i++ )
00069     m.val[i]= val[i] - mat.val[i];
00070   return m;
00071 };
00072 
00073 template<typename T, int W, int H> inline
00074 Mat<T, W, H>& Mat<T, W, H>::operator-=(typename Mat<T, W, H>::ConstMatType& mat)
00075 {
00076   for (int i= 0; i < W; i++ )
00077     val[i]-= mat.val[i];
00078   return *this;
00079 };
00080 
00081 template<typename T, int W, int H> inline
00082 Mat<T, W, H> Mat<T, W, H>::operator*(typename Mat<T, W, H>::ConstValType& scalar) const
00083 {
00084   Mat<T, W, H> m;
00085   for (int i= 0; i < W; i++ )
00086     m.val[i]= val[i] * scalar;
00087   return m;
00088 };
00089 
00090 template<typename T, int W, int H> inline
00091 Mat<T, W, H>& Mat<T, W, H>::operator*=(typename Mat<T, W, H>::ConstValType& scalar)
00092 {
00093   for (int i= 0; i < W; i++)
00094     val[i]*= scalar;
00095   return *this;
00096 };
00097 
00098 template<typename T, int W, int H> inline
00099 Mat<T, W, H> Mat<T, W, H>::operator/(typename Mat<T, W, H>::ConstValType& scalar) const
00100 {
00101   Mat<T, W, H> m;
00102   for (int i= 0; i < W; i++ )
00103     m.val[i]/= scalar;
00104   return m;
00105 };
00106 
00107 template<typename T, int W, int H> inline
00108 Mat<T, W, H>& Mat<T, W, H>::operator/=(typename Mat<T, W, H>::ConstValType& scalar)
00109 {
00110   for (int i= 0; i < W; i++)
00111     val[i]*= scalar;
00112   return *this;
00113 };
00114 
00115 
00116 
00117 template<typename T, int W, int H>
00118 template<int WW> inline
00119 Mat<T, WW, H> Mat<T, W, H>::operator*(const Mat<T, WW, W>& mat) const
00120 {
00121   Mat<T, WW, H> m;
00122   int col;
00123   int row;
00124   int i;
00125 
00126   for(col= 0; col < WW; col++ )
00127   {
00128     for(row= 0; row < W; row++ )
00129     {
00130       m(col, row)= Mat<T, WW, H>::ValTrait::zero();
00131       for(i= 0; i < W; i++ )
00132       {
00133         m(col, row)+= (*this)(i, row) * mat(col, i);
00134       }
00135     }
00136   }
00137 
00138   return m;
00139 };
00140 
00141 template<typename T, int W, int H> inline
00142 Vec<T, W> Mat<T, W, H>::operator*(const Vec<T, W>& vec) const
00143 {
00144   Vec<T, W> v;
00145   int row;
00146   int i;
00147 
00148   for(row= 0; row < W; row++ )
00149   {
00150     v[row]= Vec<T, W>::ValTrait::zero();
00151     for(i= 0; i < W; i++ )
00152     {
00153       v[row]+= (*this)(i, row) * vec[i];
00154     }
00155   }
00156 
00157   return v;
00158 };
00159 
00160 
00161 template<typename T, int W, int H> inline
00162 Mat<T, W, H>& Mat<T, W, H>::operator*=(const Mat<T, H, W>& mat)
00163 {
00164   Mat<T, W, H> m;
00165 
00166   m= (*this) * mat;
00167   (*this)= m;
00168 
00169   return (*this);
00170 };
00171 
00172 
00173 
00174 /* --------------------------------------------------------------- *\
00175     functions for the matrix _AND_ the specialisations !!
00176 \* --------------------------------------------------------------- */
00177 
00178 template<typename T, int W, int H> inline
00179 Mat<T, W, H>& matrix::assign(Mat<T, W, H>& m, const T& scalar)
00180 {
00181   for (T* i= m.begin(); i != m.end(); )
00182     *i++= scalar;
00183   return m;
00184 }
00185 
00186 template<typename T> inline
00187 Mat<T, 3, 3>& matrix::assign(Mat<T, 3, 3>& m, const T& scalar)
00188 {
00189   m.val[0]= m.val[1]= m.val[2]= scalar;
00190   return m;
00191 }
00192 
00193 template<typename T, int W, int H> inline
00194 Mat<T, W, H>& matrix::assign(Mat<T, W, H>& m, const T* valptr)
00195 {
00196   for (T* i= m.begin(); i != m.end(); )
00197     *i++= *valptr++;
00198   return m;
00199 }
00200 
00201 template<typename T, int W, int H> inline
00202 Mat<T, W, H>& matrix::assign(Mat<T, W, H>& m, const Mat<T, W, H>& mat)
00203 {
00204   const T* j= mat.begin();
00205   for (T* i= m.begin(); i != m.end(); )
00206     *i++= *j++;
00207   return m;
00208 }
00209 
00210 /* --------------------------------------------------------------- *\
00211 \* --------------------------------------------------------------- */
00212 template<typename T, int W, int H>
00213 std::ostream& operator<<(std::ostream& os, const Mat<T, W, H>& m)
00214 {
00215   os << "\n";
00216   int col;
00217   int row;
00218 
00219   for (row= 0; row < H; row++ )
00220   {
00221     os << "|";
00222     for ( col= 0; col < W; col++ )
00223     {
00224       os << m(col, row) << " ";
00225     }
00226     os << "|\n";
00227   }
00228 
00229   return os << "|";
00230 }
00231 /* --------------------------------------------------------------- *\
00232 \* --------------------------------------------------------------- */
00233 
00234 /* -- emacs - settings ------------------------------------------- *\
00235    ;;; Local Variables: ***
00236    ;;; mode:C++ ***
00237    ;;; c-basic-offset:2 ***
00238    ;;; End: ***
00239 \* --------------------------------------------------------------- */
00240 /* -- vim - settings --------------------------------------------- *\
00241   vim:set ft=cpp ts=2 ss=2:
00242 \* --------------------------------------------------------------- */
00243 

Generated on Tue Sep 2 11:33:27 2003 for math by doxygen 1.3.2