diff --git a/Numeric/fullMatrix.cpp b/Numeric/fullMatrix.cpp index ea9d2a66611cde989e501ed06ab516e2ebe547ad..7d2349efc364c56dfb0674e8b3b0aa9a1622364a 100644 --- a/Numeric/fullMatrix.cpp +++ b/Numeric/fullMatrix.cpp @@ -17,6 +17,16 @@ #define F77NAME(x) (x##_) #endif + + +/*============================================================================== + * This file improve the methods of fullVector and fullMatrix using + * - BLAS : Basic Linear Algebra Subprograms + * - LAPACK : Linear Algebra PACKage + *============================================================================*/ + + + #if defined(HAVE_BLAS) extern "C" { @@ -130,6 +140,8 @@ void fullMatrix<std::complex<double> >::mult(const fullVector<std::complex<doubl #endif + + #if defined(HAVE_LAPACK) extern "C" { @@ -307,6 +319,12 @@ bool fullMatrix<double>::svd(fullMatrix<double> &V, fullVector<double> &S) #endif + + +/*============================================================================== + * BINDINGS + *============================================================================*/ + #include "Bindings.h" template<> @@ -317,6 +335,9 @@ void fullMatrix<double>::registerBindings(binding *b) "The memory is allocated in one continuous block and stored " "in column major order (like in fortran)."); methodBinding *cm; + cm = cb->setConstructor<fullMatrix<double>,int,int>(); + cm->setDescription ("A new matrix of size 'nRows' x 'nColumns'"); + cm->setArgNames("nRows","nColumns",NULL); cm = cb->addMethod("size1", &fullMatrix<double>::size1); cm->setDescription("Returns the number of rows in the matrix"); cm = cb->addMethod("size2", &fullMatrix<double>::size2); @@ -340,9 +361,6 @@ void fullMatrix<double>::registerBindings(binding *b) cm = cb->addMethod("print", &fullMatrix<double>::print); cm->setArgNames("name",NULL); cm->setDescription("print the matrix"); - cm = cb->setConstructor<fullMatrix<double>,int,int>(); - cm->setDescription ("A new matrix of size 'nRows' x 'nColumns'"); - cm->setArgNames("nRows","nColumns",NULL); cm = cb->addMethod("invertInPlace", &fullMatrix<double>::invertInPlace); cm->setDescription("invert the matrix and return the determinant"); } diff --git a/Numeric/fullMatrix.h b/Numeric/fullMatrix.h index fecedd92165b7d0d97ebeecb77002d5475e767be..1eec0f1d4557872ebe89ac1166b2365025b5e394 100644 --- a/Numeric/fullMatrix.h +++ b/Numeric/fullMatrix.h @@ -14,32 +14,60 @@ class binding; template <class scalar> class fullMatrix; + + +/*============================================================================== + * class fullVector : An abstract interface for vectors of scalar + *============================================================================*/ + template <class scalar> class fullVector { + private: - int _r; - scalar *_data; + + int _r; // Size of the vector + scalar *_data; // Pointer on the first element friend class fullMatrix<scalar>; + public: - inline const scalar* getDataPtr() const{ - return _data; - } + + // Constructor and destructor + + fullVector(void) : _r(0),_data(0) {} fullVector(int r) : _r(r) { _data = new scalar[_r]; setAll(0.); } - fullVector(void) : _r(0),_data(0) {} fullVector(const fullVector<scalar> &other) : _r(other._r) { _data = new scalar[_r]; for(int i = 0; i < _r; ++i) _data[i] = other._data[i]; } - ~fullVector() { if(_data) delete [] _data; } - bool resize(int r) + ~fullVector() + { + if(_data) delete [] _data; + } + + // Get information (size, value) + + inline int size() const { return _r; } + inline const scalar * getDataPtr() const { return _data; } + inline scalar operator () (int i) const { return _data[i]; } + inline scalar & operator () (int i) { return _data[i]; } + + // Operations + + inline scalar norm() const + { + scalar n = 0.; + for(int i = 0; i < _r; ++i) n += _data[i] * _data[i]; + return sqrt(n); + } + bool resize(int r) { - if (_r < r){ + if (_r < r) { if (_data) delete[] _data; _r = r; _data = new scalar[_r]; @@ -49,26 +77,10 @@ class fullVector } void setAsProxy(const fullVector<scalar> &original, int r_start, int r) { - if(_data) - delete [] _data; + if(_data) delete [] _data; _r = r; _data = original._data + r_start; } - inline scalar operator () (int i) const - { - return _data[i]; - } - inline int size() const { return _r; } - inline scalar & operator () (int i) - { - return _data[i]; - } - inline scalar norm() const - { - scalar n = 0.; - for(int i = 0; i < _r; ++i) n += _data[i] * _data[i]; - return sqrt(n); - } inline void scale(const scalar s) { if(s == 0.) @@ -103,6 +115,9 @@ class fullVector { for (int i = 0; i < _r; i++) _data[i] *= x._data[i]; } + + // Printing and file treatment + void print(const char *name="") const { printf("Printing vector %s:\n", name); @@ -112,46 +127,36 @@ class fullVector } printf("\n"); } - void binarySave (FILE *f) const{ + void binarySave (FILE *f) const + { fwrite (_data, sizeof(scalar), _r, f); } - void binaryLoad (FILE *f){ + void binaryLoad (FILE *f) + { if(fread (_data, sizeof(scalar), _r, f) != _r) return; } }; + + +/*============================================================================== + * class fullMatrix : An abstract interface for matrix of scalar + *============================================================================*/ + template <class scalar> class fullMatrix { + private: - bool _own_data; // should data be freed on delete ? - int _r, _c; - scalar *_data; + + bool _own_data; // should data be freed on delete ? + int _r, _c; // Size of the matrix + scalar *_data; // Pointer on the first element + public: - inline scalar get(int r, int c) const { - #ifdef _DEBUG - if (r >= _r || r < 0 || c >= _c || c < 0) - Msg::Fatal("invalid index to access fullMatrix : %i %i (size = %i %i)", - r, c, _r, _c); - #endif - return (*this)(r, c); - } - inline void set(int r, int c, scalar v){ - #ifdef _DEBUG - if (r >= _r || r < 0 || c >= _c || c < 0) - Msg::Fatal("invalid index to access fullMatrix : %i %i (size = %i %i)", - r, c, _r, _c); - #endif - (*this)(r, c) = v; - } - inline scalar norm() const - { - scalar n = 0.; - for(int i = 0; i < _r; ++i) - for(int j = 0; j < _c; ++j) - n += (*this)(i, j) * (*this)(i, j); - return sqrt(n); - } + + // Constructor and destructor + fullMatrix(scalar *original, int r, int c) { _r = r; @@ -184,10 +189,45 @@ class fullMatrix for(int i = 0; i < _r * _c; ++i) _data[i] = other._data[i]; } fullMatrix() : _own_data(false),_r(0), _c(0), _data(0) {} - ~fullMatrix() { if(_data && _own_data) delete [] _data; } + ~fullMatrix() + { + if(_data && _own_data) delete [] _data; + } + + // Get information (size, value) + + inline int size1() const { return _r; } + inline int size2() const { return _c; } + inline scalar get(int r, int c) const { + #ifdef _DEBUG + if (r >= _r || r < 0 || c >= _c || c < 0) + Msg::Fatal("invalid index to access fullMatrix : %i %i (size = %i %i)", + r, c, _r, _c); + #endif + return (*this)(r, c); + } + + // Operations + + inline void set(int r, int c, scalar v){ + #ifdef _DEBUG + if (r >= _r || r < 0 || c >= _c || c < 0) + Msg::Fatal("invalid index to access fullMatrix : %i %i (size = %i %i)", + r, c, _r, _c); + #endif + (*this)(r, c) = v; + } + inline scalar norm() const + { + scalar n = 0.; + for(int i = 0; i < _r; ++i) + for(int j = 0; j < _c; ++j) + n += (*this)(i, j) * (*this)(i, j); + return sqrt(n); + } bool resize(int r, int c, bool resetValue = true) // data will be owned (same as constructor) { - if ((r * c > _r * _c) || !_own_data){ + if ((r * c > _r * _c) || !_own_data) { _r = r; _c = c; if (_own_data && _data) delete[] _data; @@ -197,7 +237,7 @@ class fullMatrix setAll(0.); return true; } - else{ + else { _r = r; _c = c; } @@ -234,8 +274,6 @@ class fullMatrix _own_data = false; _data = original._data; } - inline int size1() const { return _r; } - inline int size2() const { return _c; } fullMatrix<scalar> & operator = (const fullMatrix<scalar> &other) { if(this != &other){ @@ -276,8 +314,7 @@ class fullMatrix #endif return _data[i + _r * j]; } - void copy(const fullMatrix<scalar> &a, int i0, int ni, int j0, int nj, - int desti0, int destj0) + void copy(const fullMatrix<scalar> &a, int i0, int ni, int j0, int nj, int desti0, int destj0) { for(int i = i0, desti = desti0; i < i0 + ni; i++, desti++) for(int j = j0, destj = destj0; j < j0 + nj; j++, destj++) @@ -293,7 +330,7 @@ class fullMatrix _own_data = true; setAll(a); } - void mult_naive(const fullMatrix<scalar> &b, fullMatrix<scalar> &c)const + void mult_naive(const fullMatrix<scalar> &b, fullMatrix<scalar> &c) const { c.scale(0.); for(int i = 0; i < _r; i++) @@ -301,8 +338,7 @@ class fullMatrix for(int k = 0; k < _c; k++) c._data[i + _r * j] += (*this)(i, k) * b(k, j); } - ; - void mult(const fullMatrix<scalar> &b, fullMatrix<scalar> &c)const + void mult(const fullMatrix<scalar> &b, fullMatrix<scalar> &c) const #if !defined(HAVE_BLAS) { mult_naive(b,c); @@ -313,8 +349,7 @@ class fullMatrix { for (int i = 0; i < _r * _c; i++) _data[i] *= a._data[i]; } - void gemm_naive(const fullMatrix<scalar> &a, const fullMatrix<scalar> &b, - scalar alpha=1., scalar beta=1.) + void gemm_naive(const fullMatrix<scalar> &a, const fullMatrix<scalar> &b, scalar alpha=1., scalar beta=1.) { fullMatrix<scalar> temp(a.size1(), b.size2()); a.mult_naive(b, temp); @@ -322,9 +357,7 @@ class fullMatrix scale(beta); add(temp); } - ; - void gemm(const fullMatrix<scalar> &a, const fullMatrix<scalar> &b, - scalar alpha=1., scalar beta=1.) + void gemm(const fullMatrix<scalar> &a, const fullMatrix<scalar> &b, scalar alpha=1., scalar beta=1.) #if !defined(HAVE_BLAS) { gemm_naive(a,b,alpha,beta); @@ -341,7 +374,7 @@ class fullMatrix } void scale(const double s) #if !defined(HAVE_BLAS) - { + { if(s == 0.) // this is not really correct nan*0 (or inf*0) is expected to give nan for(int i = 0; i < _r * _c; ++i) _data[i] = 0.; else @@ -435,12 +468,10 @@ class fullMatrix int ni = size1(); int nj = size2(); fullMatrix<scalar> cof(ni - 1, nj - 1); - for(int I = 0; I < ni; I++){ - for(int J = 0; J < nj; J++){ + for(int I = 0; I < ni; I++) + for(int J = 0; J < nj; J++) if(J != j && I != i) cof(I < i ? I : I - 1, J < j ? J : J - 1) = (*this)(I, J); - } - } return cof; } scalar determinant() const @@ -459,6 +490,9 @@ class fullMatrix } #endif ; + + // Printing + void print(const std::string name = "") const { printf("Printing matrix %s:\n", name.c_str()); @@ -472,6 +506,9 @@ class fullMatrix printf("\n"); } } + + // Bindings + static void registerBindings(binding *b); };