matrix.cxx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   wxMaracas
00004   Module:    $RCSfile: matrix.cxx,v $
00005   Language:  C++
00006   Date:      $Date: 2009/05/14 13:55:08 $
00007   Version:   $Revision: 1.1 $
00008 
00009   Copyright: (c) 2002, 2003
00010   License:
00011   
00012      This software is distributed WITHOUT ANY WARRANTY; without even 
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00014      PURPOSE.  See the above copyright notice for more information.
00015 
00016 =========================================================================*/
00017 
00018 #include "gslobj.hxx"
00019 #include <string>
00020 #include <gsl/gsl_blas.h>
00021 #include <gsl/gsl_linalg.h>
00022 
00023 // ---------------------------------------------------------------------
00024 std::ostream& operator<<( std::ostream& os, const gslobj_matrix& m )
00025 {
00026     for( int i = 0; i < m.size1( ); i++ ) {
00027 
00028         for( int j = 0; j < m.size2( ); j++ )
00029             os << m( i, j ) << " ";
00030         os << std::endl;
00031 
00032     } // rof
00033     return( os );
00034 }
00035 
00036 // ---------------------------------------------------------------------
00037 gslobj_matrix::gslobj_matrix( size_t r, size_t c )
00038     : _copy( true )
00039 {
00040     _gsl = gsl_matrix_alloc( r, c );
00041 }
00042 
00043 // ---------------------------------------------------------------------
00044 gslobj_matrix::gslobj_matrix( const gslobj_matrix& m )
00045     : _copy( true )
00046 {
00047     _gsl = gsl_matrix_alloc( m._gsl->size1, m._gsl->size2 );
00048     gsl_matrix_memcpy( _gsl, m._gsl );
00049 }
00050 
00051 // ---------------------------------------------------------------------
00052 gslobj_matrix::gslobj_matrix( double* m, size_t r, size_t c )
00053     : _copy( false )
00054 {
00055     _view = gsl_matrix_view_array( m, r, c );
00056     _gsl = &( _view.matrix );
00057 }
00058 
00059 // ---------------------------------------------------------------------
00060 gslobj_matrix::gslobj_matrix( double* m[], size_t r, size_t c )
00061     : _copy( false )
00062 {
00063     _view = gsl_matrix_view_array( m[ 0 ], r, c );
00064     _gsl = &( _view.matrix );
00065 }
00066 
00067 // ---------------------------------------------------------------------
00068 gslobj_matrix::gslobj_matrix( gsl_matrix* m )
00069     : _copy( false )
00070 {
00071     _gsl = m;
00072 }
00073 
00074 // ---------------------------------------------------------------------
00075 /*==PS========================================
00076 void gslobj_matrix::resize( size_t r, size_t c )
00077 {
00078     if( _copy ) {
00079 
00080         if( r != rows( ) || c != columns( ) )
00081             gsl_matrix_free( _gsl );
00082         _gsl = gsl_matrix_alloc( r, c );
00083 
00084     } // fi
00085 }
00086 ==PS========================================*/
00087 // ---------------------------------------------------------------------
00088 gslobj_matrix& gslobj_matrix::operator=( const gslobj_matrix& o )
00089 {
00090     gsl_matrix_memcpy( _gsl, o._gsl );
00091     return( *this );
00092 }
00093 
00094 // ---------------------------------------------------------------------
00095 gslobj_matrix& gslobj_matrix::operator=( double o )
00096 {
00097     gsl_matrix_set_all( _gsl, o );
00098     return( *this );
00099 }
00100 
00101 // ---------------------------------------------------------------------
00102 gslobj_matrix& gslobj_matrix::operator=( double* o )
00103 {
00104     memcpy( _gsl->data, o,
00105             _gsl->size1 * _gsl->size2 * sizeof( double ) );
00106     return( *this );
00107 }
00108 
00109 // ---------------------------------------------------------------------
00110 gslobj_matrix& gslobj_matrix::operator=( double* o[] )
00111 {
00112     memcpy( _gsl->data, o[ 0 ],
00113             _gsl->size1 * _gsl->size2 * sizeof( double ) );
00114     return( *this );
00115 }
00116 
00117 // ---------------------------------------------------------------------
00118 gslobj_matrix& gslobj_matrix::operator=( gsl_matrix* o )
00119 {
00120     gsl_matrix_memcpy( _gsl, o );
00121     return( *this );
00122 }
00123 
00124 // ---------------------------------------------------------------------
00125 double& gslobj_matrix::operator()( size_t i, size_t j )
00126 {
00127     return( _gsl->data[ ( ( i * _gsl->size2 ) + j ) ] );
00128 }
00129 
00130 // ---------------------------------------------------------------------
00131 const double& gslobj_matrix::operator()( size_t i, size_t j ) const
00132 {
00133     return( _gsl->data[ ( ( i * _gsl->size2 ) + j ) ] );
00134 }
00135 
00136 // ---------------------------------------------------------------------
00137 /*==PS========================================
00138 void gslobj_matrix::setValue( size_t i, size_t j, double val )
00139 {
00140     _gsl->data[ ( ( i * _gsl->size2 ) + j ) ] = val;
00141 }
00142 ==PS========================================*/
00143 
00144 // ---------------------------------------------------------------------
00145 bool gslobj_matrix::operator==( const gslobj_matrix& o ) const
00146 {
00147     bool ret = true;
00148 
00149     if( _gsl->size1 != o._gsl->size1 || _gsl->size2 != o._gsl->size2 )
00150         return( false );
00151 
00152     for( int i = 0; i < _gsl->size1 && ret; i++ )
00153         for( int j = 0; j < _gsl->size2 && ret; j++ )
00154             ret = ret &&
00155                 ( _gsl->data[ ( ( i * _gsl->size2 ) + j ) ] !=
00156                   o._gsl->data[ ( ( i * _gsl->size2 ) + j ) ] );
00157     return( ret );
00158 }
00159 
00160 // ---------------------------------------------------------------------
00161 gslobj_matrix gslobj_matrix::operator+( const gslobj_matrix& o )
00162 {
00163     gslobj_matrix r( *this );
00164     gsl_matrix_add( r._gsl, o._gsl );
00165     return( r );
00166 }
00167 
00168 // ---------------------------------------------------------------------
00169 gslobj_matrix gslobj_matrix::operator+( double o )
00170 {
00171     gslobj_matrix r( *this );
00172     gsl_matrix_add_constant( r._gsl, o );
00173     return( r );
00174 }
00175 
00176 // ---------------------------------------------------------------------
00177 gslobj_matrix gslobj_matrix::operator+( double* o )
00178 {
00179     gslobj_matrix r( *this );
00180     gsl_matrix_view vw = gsl_matrix_view_array( o,
00181                                                 _gsl->size1,
00182                                                 _gsl->size2 );
00183     gsl_matrix_add( r._gsl, &( vw.matrix ) );
00184     return( r );
00185 }
00186 
00187 // ---------------------------------------------------------------------
00188 gslobj_matrix gslobj_matrix::operator+( double* o[] )
00189 {
00190     gslobj_matrix r( *this );
00191     gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
00192                                                 _gsl->size1,
00193                                                 _gsl->size2 );
00194     gsl_matrix_add( r._gsl, &( vw.matrix ) );
00195     return( r );
00196 }
00197 
00198 // ---------------------------------------------------------------------
00199 gslobj_matrix gslobj_matrix::operator+( gsl_matrix* o )
00200 {
00201     gslobj_matrix r( *this );
00202     gsl_matrix_add( r._gsl, o );
00203     return( r );
00204 }
00205 
00206 // ---------------------------------------------------------------------
00207 gslobj_matrix& gslobj_matrix::operator+=( const gslobj_matrix& o )
00208 {
00209     gsl_matrix_add( _gsl, o._gsl );
00210     return( *this );
00211 }
00212 
00213 // ---------------------------------------------------------------------
00214 gslobj_matrix& gslobj_matrix::operator+=( double o )
00215 {
00216     gsl_matrix_add_constant( _gsl, o );
00217     return( *this );
00218 }
00219 
00220 // ---------------------------------------------------------------------
00221 gslobj_matrix& gslobj_matrix::operator+=( double* o )
00222 {
00223     gsl_matrix_view vw = gsl_matrix_view_array( o,
00224                                                 _gsl->size1,
00225                                                 _gsl->size2 );
00226     gsl_matrix_add( _gsl, &( vw.matrix ) );
00227     return( *this );
00228 }
00229 
00230 // ---------------------------------------------------------------------
00231 gslobj_matrix& gslobj_matrix::operator+=( double* o[] )
00232 {
00233     gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
00234                                                 _gsl->size1,
00235                                                 _gsl->size2 );
00236     gsl_matrix_add( _gsl, &( vw.matrix ) );
00237     return( *this );
00238 }
00239 
00240 // ---------------------------------------------------------------------
00241 gslobj_matrix& gslobj_matrix::operator+=( gsl_matrix* o )
00242 {
00243     gsl_matrix_add( _gsl, o );
00244     return( *this );
00245 }
00246 
00247 // ---------------------------------------------------------------------
00248 gslobj_matrix gslobj_matrix::operator-( const gslobj_matrix& o )
00249 {
00250     gslobj_matrix r( *this );
00251     gsl_matrix_sub( r._gsl, o._gsl );
00252     return( r );
00253 }
00254 
00255 // ---------------------------------------------------------------------
00256 gslobj_matrix gslobj_matrix::operator-( double o )
00257 {
00258     gslobj_matrix r( *this );
00259     gsl_matrix_add_constant( r._gsl, -o );
00260     return( r );
00261 }
00262 
00263 // ---------------------------------------------------------------------
00264 gslobj_matrix gslobj_matrix::operator-( double* o )
00265 {
00266     gslobj_matrix r( *this );
00267     gsl_matrix_view vw = gsl_matrix_view_array( o,
00268                                                 _gsl->size1,
00269                                                 _gsl->size2 );
00270     gsl_matrix_sub( r._gsl, &( vw.matrix ) );
00271     return( r );
00272 }
00273 
00274 // ---------------------------------------------------------------------
00275 gslobj_matrix gslobj_matrix::operator-( double* o[] )
00276 {
00277     gslobj_matrix r( *this );
00278     gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
00279                                                 _gsl->size1,
00280                                                 _gsl->size2 );
00281     gsl_matrix_sub( r._gsl, &( vw.matrix ) );
00282     return( r );
00283 }
00284 
00285 // ---------------------------------------------------------------------
00286 gslobj_matrix gslobj_matrix::operator-( gsl_matrix* o )
00287 {
00288     gslobj_matrix r( *this );
00289     gsl_matrix_sub( r._gsl, o );
00290     return( r );
00291 }
00292 
00293 // ---------------------------------------------------------------------
00294 gslobj_matrix& gslobj_matrix::operator-=( const gslobj_matrix& o )
00295 {
00296     gsl_matrix_sub( _gsl, o._gsl );
00297     return( *this );
00298 }
00299 
00300 // ---------------------------------------------------------------------
00301 gslobj_matrix& gslobj_matrix::operator-=( double o )
00302 {
00303     gsl_matrix_add_constant( _gsl, -o );
00304     return( *this );
00305 }
00306 
00307 // ---------------------------------------------------------------------
00308 gslobj_matrix& gslobj_matrix::operator-=( double* o )
00309 {
00310     gsl_matrix_view vw = gsl_matrix_view_array( o,
00311                                                 _gsl->size1,
00312                                                 _gsl->size2 );
00313     gsl_matrix_sub( _gsl, &( vw.matrix ) );
00314     return( *this );
00315 }
00316 
00317 // ---------------------------------------------------------------------
00318 gslobj_matrix& gslobj_matrix::operator-=( double* o[] )
00319 {
00320     gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
00321                                                 _gsl->size1,
00322                                                 _gsl->size2 );
00323     gsl_matrix_sub( _gsl, &( vw.matrix ) );
00324     return( *this );
00325 }
00326 
00327 // ---------------------------------------------------------------------
00328 gslobj_matrix& gslobj_matrix::operator-=( gsl_matrix* o )
00329 {
00330     gsl_matrix_sub( _gsl, o );
00331     return( *this );
00332 }
00333 
00334 // ---------------------------------------------------------------------
00335 gslobj_matrix gslobj_matrix::operator*( const gslobj_matrix& o )
00336 {
00337     gslobj_matrix r( *this );
00338     gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
00339                     1.0, r._gsl, o._gsl,
00340                     0.0, _gsl );
00341     return( r );
00342 }
00343 
00344 // ---------------------------------------------------------------------
00345 gslobj_matrix gslobj_matrix::operator*( double o )
00346 {
00347     gslobj_matrix r( *this );
00348     gsl_matrix_scale( r._gsl, o );
00349     return( r );
00350 }
00351 
00352 // ---------------------------------------------------------------------
00353 gslobj_matrix gslobj_matrix::operator*( double* o )
00354 {
00355     gslobj_matrix r( *this );
00356     gsl_matrix_view vw = gsl_matrix_view_array( o,
00357                                                 _gsl->size1,
00358                                                 _gsl->size2 );
00359     gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
00360                     1.0, r._gsl, &( vw.matrix ),
00361                     0.0, _gsl );
00362     return( r );
00363 }
00364 
00365 // ---------------------------------------------------------------------
00366 gslobj_matrix gslobj_matrix::operator*( double* o[] )
00367 {
00368     gslobj_matrix r( *this );
00369     gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
00370                                                 _gsl->size1,
00371                                                 _gsl->size2 );
00372     gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
00373                     1.0, r._gsl, &( vw.matrix ),
00374                     0.0, _gsl );
00375     return( r );
00376 }
00377 
00378 // ---------------------------------------------------------------------
00379 gslobj_matrix gslobj_matrix::operator*( gsl_matrix* o )
00380 {
00381     gslobj_matrix r( *this );
00382     gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
00383                     1.0, r._gsl, o,
00384                     0.0, _gsl );
00385     return( r );
00386 }
00387 
00388 // ---------------------------------------------------------------------
00389 gslobj_vector gslobj_matrix::operator*( const gslobj_vector& o )
00390 {
00391     gslobj_vector ret( rows( ) );
00392     gsl_blas_dgemv( CblasNoTrans, 1.0, _gsl,
00393                     ( gsl_vector* )o, 0.0,
00394                     ( gsl_vector* )ret );
00395     return( ret );
00396 }
00397 
00398 // ---------------------------------------------------------------------
00399 gslobj_matrix& gslobj_matrix::operator*=( const gslobj_matrix& o )
00400 {
00401     gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
00402                     1.0, _gsl, o._gsl,
00403                     0.0, _gsl );
00404     return( *this );
00405 }
00406 
00407 // ---------------------------------------------------------------------
00408 gslobj_matrix& gslobj_matrix::operator*=( double o )
00409 {
00410     gsl_matrix_scale( _gsl, o );
00411     return( *this );
00412 }
00413 
00414 // ---------------------------------------------------------------------
00415 gslobj_matrix& gslobj_matrix::operator*=( double* o )
00416 {
00417     gsl_matrix_view vw = gsl_matrix_view_array( o,
00418                                                 _gsl->size1,
00419                                                 _gsl->size2 );
00420     gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
00421                     1.0, _gsl, &( vw.matrix ),
00422                     0.0, _gsl );
00423     return( *this );
00424 }
00425 
00426 // ---------------------------------------------------------------------
00427 gslobj_matrix& gslobj_matrix::operator*=( double* o[] )
00428 {
00429     gsl_matrix_view vw = gsl_matrix_view_array( o[ 0 ],
00430                                                 _gsl->size1,
00431                                                 _gsl->size2 );
00432     gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
00433                     1.0, _gsl, &( vw.matrix ),
00434                     0.0, _gsl );
00435     return( *this );
00436 }
00437 
00438 // ---------------------------------------------------------------------
00439 gslobj_matrix& gslobj_matrix::operator*=( gsl_matrix* o )
00440 {
00441     gsl_blas_dgemm( CblasNoTrans, CblasNoTrans,
00442                     1.0, _gsl, o,
00443                     0.0, _gsl );
00444     return( *this );
00445 }
00446 
00447 // ---------------------------------------------------------------------
00448 /*==PS========================================
00449 gslobj_matrix gslobj_matrix::transpose( )
00450 {
00451     gslobj_matrix r( _gsl->size2, _gsl->size1 ); 
00452     gsl_matrix_transpose_memcpy( r._gsl, _gsl );
00453     return( r );
00454 }
00455 ==PS========================================*/
00456 // ---------------------------------------------------------------------
00457 /*==PS========================================
00458 gslobj_matrix gslobj_matrix::invertLU( )
00459 {
00460     gslobj_matrix r( *this ), lu( *this );
00461     gsl_permutation* perm = gsl_permutation_calloc( rows( ) );
00462     int sign;
00463 
00464     gsl_linalg_LU_decomp( lu._gsl, perm, &sign );
00465     gsl_linalg_LU_invert( lu._gsl, perm, r._gsl );
00466     return( r );
00467 }
00468 ==PS========================================*/
00469 // ---------------------------------------------------------------------
00470 /*==PS========================================
00471 double gslobj_matrix::determinant( )
00472 {
00473     gslobj_matrix lu( *this );
00474     gsl_permutation* perm = gsl_permutation_calloc( rows( ) );
00475     int sign;
00476 
00477     gsl_linalg_LU_decomp( lu._gsl, perm, &sign );
00478     return( gsl_linalg_LU_det( lu._gsl, sign ) );
00479 }
00480 ==PS========================================*/
00481 // ---------------------------------------------------------------------
00482 /*==PS========================================
00483 void gslobj_matrix::identity( )
00484 {
00485     gsl_matrix_set_identity( _gsl );
00486 }
00487 ==PS========================================*/
00488 // eof - gslobj_matrix.cxx

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1