Matrix.cxx

Go to the documentation of this file.
00001 #include "AtlfastUtils/Matrix.h"
00002 #include <cstddef>
00003 #include <assert.h>
00004 namespace Atlfast{
00005   Matrix::~Matrix(){}
00006   Matrix::Matrix(const Matrix& m): m_v(m.m_v), m_d1(m.m_d1), m_d2(m.m_d2){}
00007   Matrix::Matrix(size_t x, size_t y){
00008     m_d1=x;
00009     m_d2=y;
00010     m_v=new valarray<double>(x*y);
00011   }
00012 
00013   Matrix::Matrix(size_t x, size_t y, double init){
00014     m_d1=x;
00015     m_d2=y;
00016     m_v=new valarray<double>(x*y);
00017     for(size_t i=0; i<m_d1*m_d2; ++i)  m_v[i]=init;
00018   }
00019 
00020   double& Matrix::operator()(size_t x, size_t y){
00021     return column(x)[y];
00022   }
00023 
00024   double mul(const Cslice_iter<double>& v1, 
00025              const valarray<double>& v2){
00026     double res=0;
00027     for( size_t i=0; i<v2.size(); i++) res+=v1[i]*v2[i];
00028     return res;
00029   }
00030 
00031   valarray<double> operator*(const Matrix&m, const valarray<double>&v){
00032     valarray<double> res(m.dim2());
00033     for(size_t i=0; i<m.dim2(); i++) res[i]=mul(m.row(i), v);
00034     return res;
00035   }
00036 
00037   Matrix& Matrix::operator*=(double d){
00038     (*m_v) *= d;
00039     return *this;
00040   }
00041   Matrix Matrix::sub(size_t minRow, size_t maxRow, 
00042                      size_t minCol, size_t maxCol) const{
00043     size_t endRow=maxRow+1;
00044     size_t endCol=maxCol+1;
00045 
00046     assert(endRow<=m_d1);
00047     assert(endCol<=m_d2);
00048     assert(endRow>minRow);
00049     assert(endCol>minCol);
00050 
00051     size_t nRow=endRow-minRow;
00052     
00053     size_t nCol=endCol-minCol;
00054 
00055     Matrix m(nRow, nCol);
00056     size_t ii=0;
00057     size_t jj;
00058     for(size_t i = minRow; i<endRow; ++i){
00059       jj=0;
00060       for(size_t j = minCol; j<endCol; ++j) m[ii][jj++]=(*this)[i][j];
00061       ++ii;
00062     }
00063     assert(ii == endRow);
00064     assert(jj == endCol);
00065     return m;
00066   }
00067   void Matrix::sub(size_t minRow, size_t minCol, Matrix& m) const{
00068     size_t endRow=minRow+m.m_d1;
00069     size_t endCol=minCol+m.m_d2;
00070 
00071     assert(endRow<=m_d1);
00072     assert(endCol<=m_d2);
00073     assert(endRow>minRow);
00074     assert(endCol>minCol);
00075 
00076     size_t ii=0;
00077     size_t jj;
00078     for(size_t i = minRow; i<endRow; ++i){
00079       jj=0;
00080       for(size_t j = minCol; j<endCol; ++j) m[ii][jj++]=(*this)[i][j];
00081       ++ii;
00082     }
00083     assert(ii == endRow);
00084     assert(jj == endCol);
00085     return;
00086   }
00087 }//namespace
00088 
00089 
00090 
00091 
00092 
00093 
00094 

Generated on Fri Sep 21 13:20:37 2007 for AtlfastUtils by  doxygen 1.5.1