#include #include #include #define DEFAULT_ALLOC 2 //Defining ARRAYS_DEBUG turns on bounds checking and size checking #define ARRAYS_DEBUG /* This file implements Vector and matrix for doubles and ints. Some arithmetic operations are defined. An LU and LU backsubstitution is provided for solving non-signular linear equations. It still needs linear algebra operations defined. */ class matrix; class imatrix; class iVector; class Vector { friend class matrix; double *data; int len; public: //constructors Vector(); Vector(int n); //copy operator Vector(const Vector& original); //destructor ~Vector(); //assignment operator Vector& operator =(const Vector &original); Vector& operator =(const Vector original); //not really different or needed double& operator[](int i)const ; Vector operator +(const Vector& v); Vector operator -(const Vector& v); friend Vector operator*(double,Vector); friend Vector operator*(Vector,double); //friend Vector operator*(Vector&); //printing for debugging purposes void rprint() const; void print()const ; void resize(int n); friend double dot(const Vector& v1, const Vector& v2); friend double norm(const Vector& v); double norm(void)const; void zero(void); int length() const{ return len;} int operator==(const Vector& v)const; double max(void)const; double min(void)const; friend ostream& operator<<(ostream& s,Vector v); double mean()const; }; class iVector { friend class imatrix; int *data; int len; public: //constructors iVector(); iVector(int n); //copy operator iVector(const iVector& original); //destructor ~iVector(); //assignment operator iVector& operator =(const iVector &original); iVector& operator =(const iVector original); int& operator[](int i)const; iVector operator +(const iVector& v); iVector operator -(const iVector& v); friend iVector operator*(int,iVector); friend iVector operator*(iVector,int); //friend iVector operator*(iVector&); void rprint() const; void print()const ; friend int dot(const iVector& v1, const iVector& v2); friend double norm(const iVector& v); int max(void)const; int min(void)const; int length() const{ return len;} void zero(void); int operator==(const iVector& v)const; friend ostream& operator<<(ostream& s,iVector v); }; /* Vector class definitions */ double Vector::max(void)const { double max=data[0]; for(int i=1;i max) max=data[i]; return max; } double Vector::min(void)const { double min=data[0]; for(int i=1;i= len) { cerr << "ERROR Vector::operator[](int i) const with i = " << i << " out of bounds" << endl; cerr << "The length of the vector is " << len << endl; print(); exit(2); } #endif return data[i]; } Vector::~Vector(){delete [] data;} Vector::Vector(int n) { data = new double[len=n]; if(!data) { cerr << "VECTOR Error: Vector::Vector(int n) can't allocate memory with n = " << n << endl; exit(2); } } Vector::Vector() { data = new double[DEFAULT_ALLOC]; len=DEFAULT_ALLOC; if(!data) { cerr << "VECTOR Error: Vector::Vector() can't allocate memory" << endl; exit(2); } } Vector operator*(double x,Vector v) { int i; Vector ans(v.len); for(i=0;i max) max=data[i]; return max; } int iVector::min()const { int min=data[0]; for(int i=1;i= len) { cerr << "ERROR iVector::operator[](int i) const with i = " << i << " out of bounds" << endl; print(); exit(2); } #endif return data[i]; } iVector::~iVector(){delete [] data;} iVector::iVector(int n) { data = new int[len=n]; if(!data) { cerr << "VECTOR Error: iVector::iVector(int n) can't allocate memory with n = " << n << endl; exit(2); } } iVector::iVector() { data = new int[DEFAULT_ALLOC]; len=DEFAULT_ALLOC; if(!data) { cerr << "VECTOR Error: iVector::iVector() can't allocate memory" << endl; exit(2); } } iVector operator*(int x,iVector v) { int i; iVector ans(v.len); for(i=0;i=rows) { cerr << "MATRIX Error: select row operator index " << i << " out of range\n"; print(); exit(2); } #endif return m[i]; } Vector matrix::operator*(const Vector& v) { int i,j; #ifdef ARRAYS_DEBUG if(cols != v.len) { cerr << "MATRIX Error: multiplying matrix times Vector with wrong sizes\n"; print(); v.rprint(); exit(2); } #endif Vector ans(rows); for(i=0;i= rows) { cerr << "ERROR: matrix::rowsum(int i) row number " << i << "out of bounds" << endl; print(); exit(2); } #endif double sum=0; for(int k=0;k 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=0;i--) { sum=b[i]; for (j=i+1;j= rows) { cerr << "iMatrix ERROR: row number " << i << "out of bounds" << endl; print(); exit(2); } #endif int sum=0; for(int k=0;k