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