00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #if !defined( _matrix_float_h )
00021 #define _matrix_float_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_float.h>
00032 #include <gsl/gsl_linalg.h>
00033 #include <gslwrap/permutation.h>
00034 #include <gslwrap/vector_float.h>
00035
00036 #define type_is_float
00037 #ifdef type_is
00038 #define type_is_double
00039 #endif
00040
00041 namespace gsl
00042 {
00043
00045 class matrix_float
00046 {
00047 #ifdef type_is_double
00048 friend class matrix_float;
00049 friend class matrix_int;
00050 #endif
00051 public:
00053 matrix_float();
00055 matrix_float( size_t new_rows, size_t new_cols, bool clear = true );
00056
00057 void copy(const matrix_float &other)
00058 {
00059 set_dimensions(other.size1(),other.size2());
00060 gsl_matrix_float_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_float_set( m, i, j, (float)other(i,j));
00071 }
00072 }
00073 }
00074 matrix_float( const matrix_float &other ):m(NULL) {copy(other);}
00076 template<class oclass>
00077 matrix_float( const oclass &other ):m(NULL) {copy(other);}
00078
00080 ~matrix_float();
00082
00084
00086
00088
00090
00091
00092
00094 void dimensions( size_t *num_rows, size_t *num_cols ) const;
00096 float get_element ( size_t row, size_t col ) const {return gsl_matrix_float_get( m, row, col ) ;}
00097 const float &operator()( size_t row, size_t col ) const {return *gsl_matrix_float_ptr( m, row, col ) ;}
00098 float &operator()( size_t row, size_t col ) {return *gsl_matrix_float_ptr( m, row, col ) ;}
00100 void set_element( size_t row, size_t col, const float &v ){ gsl_matrix_float_set( m, row, col, v );}
00102 void set_elements( const float & new_value );
00103 void set_all ( const float & new_value ) {gsl_matrix_float_set_all ( m, new_value );}
00104 void set_zero() {gsl_matrix_float_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_float& m );
00113
00114 int fwrite (FILE * stream) const {return gsl_matrix_float_fwrite (stream, m);}
00115
00116
00117 int fread (FILE * stream) {return gsl_matrix_float_fread (stream, m);}
00118
00120 void load_binary( const char *filename );
00122 void save_binary( const char *filename ) const;
00124 bool operator==( const matrix_float &other ) const;
00125 bool operator!=( const matrix_float &other ) const {return !((*this)==other);}
00126
00127 matrix_float &operator=( const matrix_float &other ){copy(other);return *this;}
00129 template<class omatrix>
00130 matrix_float &operator=( const omatrix &other ){copy(other);return *this;}
00132 matrix_float operator+( const matrix_float &other ) const;
00134 matrix_float operator+( const float &f ) const;
00136 friend matrix_float operator+( const float &f, const matrix_float &other );
00138 matrix_float &operator+=( const float &f );
00140 matrix_float &operator+=( const matrix_float &other );
00142 matrix_float operator-( const matrix_float &other ) const;
00144 matrix_float operator-( const float &f ) const;
00146 friend matrix_float operator-( const float &f, const matrix_float &other );
00148 matrix_float &operator-=( const float &f );
00150 matrix_float &operator-=( const matrix_float &other );
00152 matrix_float operator*( const matrix_float &other ) const;
00154 matrix_float operator*( const float &f ) const;
00156 friend matrix_float operator*( const float &f, const matrix_float &other );
00158 matrix_float &operator*=( const float &f );
00160 matrix_float &operator*=( const matrix_float &other );
00162 matrix_float operator/( const float &) const;
00164 matrix_float &operator/=( const float &);
00166 matrix_float transpose() const;
00168 matrix_float LU_decomp(gsl::permutation *perm=NULL,int *psign=NULL) const;
00170 matrix_float LU_invert() const;
00171 private:
00173 void LU_decomp( gsl_matrix_float **a,
00174 gsl_permutation **permutation,
00175 int *sign ) const;
00176 public:
00178 float sum() const;
00180 double LU_lndet() const;
00181
00182
00184 vector_float_view row( size_t rowindex );
00185 const vector_float_view row( size_t rowindex ) const ;
00187 vector_float_view column( size_t colindex );
00188 const vector_float_view column( size_t colindex ) const;
00189
00191 matrix_float get_row( size_t rowindex ) const;
00193 matrix_float get_col( size_t colindex ) const;
00195 matrix_float row_sum() const;
00197 matrix_float column_sum() const;
00199 double trace() const;
00201 int cholesky_decomp( matrix_float &a ) const;
00202
00203
00205 matrix_float covariance() const;
00207 bool is_square() const;
00209 void set_diagonal( float f );
00211 void identity( size_t k );
00213 double norm( double n ) const;
00214
00216 gsl_matrix_float *gslobj() {if (!m){cout << "matrix_float::gslobj ERROR, data not initialized!! " << endl; exit(-1);}return m;}
00217 const gsl_matrix_float *gslobj() const {if (!m){cout << "matrix_float::gslobj ERROR, data not initialized!! " << endl; exit(-1);}return m;}
00218 private:
00220 gsl_matrix_float *m;
00221
00222 };
00223 }
00224 #undef type_is_float
00225 #undef type_is_double
00226
00227 #endif // _matrix_float_h