00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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 }
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
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
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
00138
00139
00140
00141
00142
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
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488