#include #include #include //#define NDEBUG // uncomment to remove checking of assert() #include #define DEFAULT_ALLOC 2 template class matrix; template class vector { friend class matrix; ElType * data; int len; public: int length()const; vector(); vector(int n); ~vector(){ delete [] data;} //Copy operator vector(const vector& v) ; //assignment operator vector& operator =(const vector &original); ElType& operator[](int i)const ; void zero(); vector operator+(const vector& v); vector operator-(const vector&v); void rprint()const; //print entries on a single line void resize(int n); int operator==(const vector& v)const; friend vector operator*(ElType c,vector& v ); friend vector operator*(vector& v,ElType c ); friend ostream& operator<<(ostream& s,vector& v); }; template void vector::zero() { for(int i=0;i int vector::length()const { return len; } template ElType& vector::operator[](int i)const { assert(i>=0 && i < len); return data[i]; } template vector::vector() { data=new ElType[ DEFAULT_ALLOC]; assert(data!=0); len= DEFAULT_ALLOC; } template vector::vector(int n) { data = new ElType[len=n]; assert(data!=0); } template vector::vector(const vector& v) { data=new ElType[len=v.len]; assert(data!=0); for(int i=0;i vector& vector::operator =(const vector &original) { if(this != &original) { delete [] data; data= new ElType[len=original.len]; assert(data!=0); for(int i=0;i vector vector::operator+(const vector& v) { vector sum(len); for(int i=0;i vector vector::operator-(const vector& v) { vector sum(len); for(int i=0;i void vector::rprint()const //print entries on a single line { int i; cout << "VECTOR: "; cout << "("; for(i=0;i void vector::resize(int n) { delete[]data; data = new ElType[len=n]; assert(data !=0); } template int vector::operator==(const vector& v)const { if(len != v.len) return 0; for(int i=0;i vector operator*(ElType c,vector& v ) { vector ans(v.len); for(int i=0;i vector operator*(vector& v,ElType c ) { vector ans(v.len); for(int i=0;i ostream& operator<<(ostream& s,vector& v) { s << "("; for(int i=0;i class matrix { vector *m; int rows,cols; public: matrix(); matrix( int r, int c); matrix(const matrix &s); ~matrix(); matrix& operator =(const matrix& s); vector& operator[](const int i); vector operator*(const vector&); friend matrix operator*(const ElType&, const matrix&); friend matrix operator*(const matrix&, const ElType&); matrix operator*(const matrix& a); matrix operator+(const matrix& a); matrix operator-(const matrix& a); matrix transpose(); //matrix inverse(); friend ostream& operator<<(ostream& s,matrix& m); friend void ludcmp(matrix& a,vector& indx,double &d); friend void lubksb(matrix&a,vector& indx,vector&b); }; template matrix::matrix() { m = new vector[DEFAULT_ALLOC]; assert(m !=0); rows=cols=DEFAULT_ALLOC; for(int i=0;i v; m[i]= v; } } template matrix::matrix(int r, int c) { m= new vector[r]; assert(m != 0); rows=r; cols=c; for(int i=0;i v(cols); m[i]=v; } } template matrix::matrix(const matrix &s) { int i; rows=s.rows; m = new vector[rows]; assert(m!=0); cols =s.cols; for(i=0;i matrix::~matrix() { delete [] m; } template matrix& matrix::operator =(const matrix &s) { if(this != &s) { delete []m; rows= s.rows; cols=s.cols; m = new vector[rows]; assert(m !=0); for(int i=0;i vector& matrix::operator[](const int i) { assert(i>=0 && i < rows); return m[i]; } template vector matrix::operator*(const vector& v) { int i,j; assert(cols == v.len); vector ans(rows); for(i=0;i matrix operator*(const ElType& x,const matrix& s) { matrix ans(s.rows,s.cols); for(int i=0;i matrix matrix::transpose() { matrix ans(cols,rows); for(int i=0;i matrix operator*(const matrix& s,const ElType& x) { matrix ans(s.rows,s.cols); for(int i=0;i matrix matrix ::operator*(const matrix& a) { assert(cols == a.rows); matrix ans(rows,a.cols); for(int i=0;i matrix matrix ::operator+(const matrix & a) { int i,j; assert(rows== a.rows); assert(cols== a.cols); matrix ans(a.rows,a.cols); for(i=0;i matrix matrix::operator-(const matrix& a) { int i,j; assert(rows == a.rows); assert(cols == a.cols); matrix ans(rows,cols); for(i=0;i ostream& operator<<(ostream& s,matrix& m) { for(int i=0; i void ludcmp(matrix& a, vector& indx,double& d) { int i,imax,j,k; ElType big,dum,sum,temp; int n=a.rows; vector vv(n); assert(a.rows == a.cols); d=1.0; for (i=0;i big) big=temp; if (big == 0.0) cerr << "Singular matrix in routine LUDCMP" << endl; vv[i]=1.0/big; } for (j=0;j= big) { big=dum; imax=i; } } if (j != imax) { for (k=0;k void lubksb(matrix& a,vector& indx,vector& b) { int i,ip,j; ElType sum; int n=a.rows; for (i=0;i=0;i--) { sum=b[i]; for (j=i+1;j