#ifndef __MYMATRIX__ #define __MYMATRIX__ #include #include #include #include #include "Vector.hh" using namespace std; extern void GetSpace(size_t n); extern void FreeSpace(); class Matrix{ private: size_t size1; size_t size2; size_t lda; double * data; int owner; public: friend class Vector; friend void eig(const Matrix& M, Matrix& V, Vector& er, Vector& ei); friend void eig(const Matrix& M, Vector& er, Vector& ei); friend void svd(const Matrix& M, Vector& S); friend void svd(const Matrix& M, Vector& S, Matrix& U, Matrix& V); friend void solve(const Matrix& M, const Vector& v, Vector& soln); friend void solve(const Matrix& M, const Vector& v); friend void mult(const Matrix& M1, const Matrix& M2, Matrix& prod); friend void mult(const Matrix& M1, Matrix& M2); friend void mult(const Matrix& M, const Vector& v, Vector& prod); friend void mult(const Matrix& M, Vector& v); friend void transpose(const Matrix& M1, Matrix& M2); friend void invert(const Matrix& M1, Matrix& M2); friend double det(const Matrix& M); friend void fft(const Vector& v, Vector& vf); friend void fft_destroy_plan();//deallocate all fftw plans friend void ifft(const Vector& vf, Vector& v); friend void diff(const Vector& v, Vector& vd); friend void diff(const Matrix& M, Matrix & N);//differentiates row-by-row friend void shift(const Vector& v, double h, Vector& w); friend void shift(const Matrix& M, double h, Matrix& N); //shifts row-wise friend void filter(const Vector& v, double alpha, Vector& w); friend void expm(const Matrix& M1, Matrix& M2); friend void spline(const Vector& t, const Vector& v, double leftD, double rightD, const Vector& tt, Vector& vv); friend void spline(const Vector& t, const Matrix& M, const Vector& leftD, const Vector& rightD, const Vector& tt, Matrix& MM); friend void cspline(const Vector& t, const Vector& v, const Vector& tt, Vector& vv); friend void cspline(const Vector& t, const Matrix& M, const Vector& tt, Matrix& MM); friend void matrixsmooth(const Matrix& X, double alpha, Matrix& XX); public: //empty constructor Matrix(){ size1 = 0; size2 = 0; lda = 0; data = NULL; owner = 0; } //only constructor to actually allocate space for data Matrix(size_t m, size_t n){ size1 = m; size2 = n; lda = m; data = new double[m*n]; owner = 1; } //copy constructor, makes *this a shadow of M Matrix(const Matrix& M){ size1 = M.size1; size2 = M.size2; lda = M.lda; data = M.data; owner = 0; } //makes *this a shadow of M(i1:i2, j1:j2) Matrix(const Matrix& M, size_t i1, size_t i2, size_t j1, size_t j2){ assert((i1<=i2)&&(j1<=j2)&&(i2shadow(v,i1,i1+m*n-1,m,n); } //makes *this a m by n matrix shadowing v(0:m*n-1) void shadow(const Vector& v, size_t m, size_t n){ this->shadow(v,0,m*n-1,m,n); } //returns shadow of (*this)(i1:i2,j1:j2) Matrix getShadow(size_t i1, size_t i2, size_t j1, size_t j2)const{ Matrix temp; assert((i1<=i2)&&(j1<=j2)&&(i2getColumn(i)).norm(); ans += temp*temp; } return sqrt(ans); } //output matrix to file fname void output(const char *fname)const{ ofstream ofile(fname); ofile.setf(ios::scientific, ios::floatfield); ofile.precision(16); size_t i,j; for(i=0; i < size1; i++){ for(j=0; j < size2; j++) ofile<<(*this)(i,j)<<" "; ofile<>(*this)(i,j); } ifile.close(); } //use with care! // double * getRawData()const{ // return data; //} }; #endif