00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #if !defined( _matrix_double_h )
00021 #define _matrix_double_h
00022
00023 #include <iostream.h>
00024 #include <fstream.h>
00025 #include <iomanip.h>
00026 #include <math.h>
00027 #include <stdlib.h>
00028
00030 #include <gsl/gsl_math.h>
00031 #include <gsl/gsl_matrix.h>
00032 #include <gsl/gsl_linalg.h>
00033 #include <gslwrap/permutation.h>
00034 #include <gslwrap/vector_double.h>
00035
00036 #define type_is
00037 #ifdef type_is
00038 #define type_is_double
00039 #endif
00040
00041 namespace gsl
00042 {
00043
00045 class matrix
00046 {
00047 #ifdef type_is_double
00048 friend class matrix_float;
00049 friend class matrix_int;
00050 #endif
00051 public:
00053 matrix();
00055 matrix( size_t new_rows, size_t new_cols, bool clear = true );
00056
00057 void copy(const matrix &other)
00058 {
00059 set_dimensions(other.size1(),other.size2());
00060 gsl_matrix_memcpy( m, other.m );
00061 }
00062 template<class oclass>
00063 void copy(const oclass &other)
00064 {
00065 set_dimensions( other.get_rows(), other.get_cols() );
00066 for ( size_t i = 0; i < get_rows(); i++ )
00067 {
00068 for ( size_t j = 0; j < get_cols(); j++ )
00069 {
00070 gsl_matrix_set( m, i, j, (double)other(i,j));
00071 }
00072 }
00073 }
00074 matrix( const matrix &other ):m(NULL) {copy(other);}
00076 template<class oclass>
00077 matrix( const oclass &other ):m(NULL) {copy(other);}
00078
00080 ~matrix();
00082
00084
00086
00088
00090
00091
00092
00094 void dimensions( size_t *num_rows, size_t *num_cols ) const;
00096 double get_element ( size_t row, size_t col ) const {return gsl_matrix_get( m, row, col ) ;}
00097 const double &operator()( size_t row, size_t col ) const {return *gsl_matrix_ptr( m, row, col ) ;}
00098 double &operator()( size_t row, size_t col ) {return *gsl_matrix_ptr( m, row, col ) ;}
00100 void set_element( size_t row, size_t col, const double &v ){ gsl_matrix_set( m, row, col, v );}
00102 void set_elements( const double & new_value );
00103 void set_all ( const double & new_value ) {gsl_matrix_set_all ( m, new_value );}
00104 void set_zero() {gsl_matrix_set_zero( m );}
00106 void set_dimensions( size_t new_rows, size_t new_cols );
00108 void load( const char *filename );
00110 void save( const char *filename ) const;
00112 friend ostream& operator<< ( ostream& os, const matrix& m );
00113
00114 int fwrite (FILE * stream) const {return gsl_matrix_fwrite (stream, m);}
00115
00116
00117 int fread (FILE * stream) {return gsl_matrix_fread (stream, m);}
00118
00120 void load_binary( const char *filename );
00122 void save_binary( const char *filename ) const;
00124 bool operator==( const matrix &other ) const;
00125 bool operator!=( const matrix &other ) const {return !((*this)==other);}
00126
00127 matrix &operator=( const matrix &other ){copy(other);return *this;}
00129 template<class omatrix>
00130 matrix &operator=( const omatrix &other ){copy(other);return *this;}
00132 matrix operator+( const matrix &other ) const;
00134 matrix operator+( const double &f ) const;
00136 friend matrix operator+( const double &f, const matrix &other );
00138 matrix &operator+=( const double &f );
00140 matrix &operator+=( const matrix &other );
00142 matrix operator-( const matrix &other ) const;
00144 matrix operator-( const double &f ) const;
00146 friend matrix operator-( const double &f, const matrix &other );
00148 matrix &operator-=( const double &f );
00150 matrix &operator-=( const matrix &other );
00152 matrix operator*( const matrix &other ) const;
00154 matrix operator*( const double &f ) const;
00156 friend matrix operator*( const double &f, const matrix &other );
00158 matrix &operator*=( const double &f );
00160 matrix &operator*=( const matrix &other );
00162 matrix operator/( const double &) const;
00164 matrix &operator/=( const double &);
00166 matrix transpose() const;
00168 matrix LU_decomp(gsl::permutation *perm=NULL,int *psign=NULL) const;
00170 matrix LU_invert() const;
00171 private:
00173 void LU_decomp( gsl_matrix **a,
00174 gsl_permutation **permutation,
00175 int *sign ) const;
00176 public:
00178 double sum() const;
00180 double LU_lndet() const;
00181
00182
00184 vector_view row( size_t rowindex );
00185 const vector_view row( size_t rowindex ) const ;
00187 vector_view column( size_t colindex );
00188 const vector_view column( size_t colindex ) const;
00189
00191 matrix get_row( size_t rowindex ) const;
00193 matrix get_col( size_t colindex ) const;
00195 matrix row_sum() const;
00197 matrix column_sum() const;
00199 double trace() const;
00201 int cholesky_decomp( matrix &a ) const;
00202
00203
00205 matrix covariance() const;
00207 bool is_square() const;
00209 void set_diagonal( double f );
00211 void identity( size_t k );
00213 double norm( double n ) const;
00214
00216 gsl_matrix *gslobj() {if (!m){cout << "matrix::gslobj ERROR, data not initialized!! " << endl; exit(-1);}return m;}
00217 const gsl_matrix *gslobj() const {if (!m){cout << "matrix::gslobj ERROR, data not initialized!! " << endl; exit(-1);}return m;}
00218 private:
00220 gsl_matrix *m;
00221
00222 };
00223 }
00224 #undef type_is
00225 #undef type_is_double
00226
00227 #endif // _matrix_double_h