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 }
00088
00089
00090
00091
00092
00093
00094