vector.cxx
Go to the documentation of this file.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
00022
00023 std::ostream& operator<<( std::ostream& os, const gslobj_vector& v )
00024 {
00025 for( int i = 0; i < v.size( ); i++ ) os << " " << v( i );
00026 return( os );
00027 }
00028
00029
00030 gslobj_vector::gslobj_vector( size_t s )
00031 : _copy( true )
00032 {
00033 _gsl = gsl_vector_alloc( s );
00034 }
00035
00036
00037 gslobj_vector::gslobj_vector( const gslobj_vector& v )
00038 : _copy( true )
00039 {
00040 _gsl = gsl_vector_alloc( v._gsl->size );
00041 gsl_vector_memcpy( _gsl, v._gsl );
00042 }
00043
00044
00045 gslobj_vector::gslobj_vector( double* v, size_t s )
00046 : _copy( false )
00047 {
00048 _view = gsl_vector_view_array( v, s );
00049 _gsl = &( _view.vector );
00050 }
00051
00052
00053 gslobj_vector::gslobj_vector( gsl_vector* v )
00054 : _copy( false )
00055 {
00056 _gsl = v;
00057 }
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 gslobj_vector& gslobj_vector::operator=( const gslobj_vector& o )
00074 {
00075 gsl_vector_memcpy( _gsl, o._gsl );
00076 return( *this );
00077 }
00078
00079
00080 gslobj_vector& gslobj_vector::operator=( double o )
00081 {
00082 gsl_vector_set_all( _gsl, o );
00083 return( *this );
00084 }
00085
00086
00087 gslobj_vector& gslobj_vector::operator=( double* o )
00088 {
00089 memcpy( _gsl->data, o, _gsl->size * sizeof( double ) );
00090 return( *this );
00091 }
00092
00093
00094 gslobj_vector& gslobj_vector::operator=( gsl_vector* o )
00095 {
00096 gsl_vector_memcpy( _gsl, o );
00097 return( *this );
00098 }
00099
00100
00101 bool gslobj_vector::operator==( const gslobj_vector& o ) const
00102 {
00103 bool ret = true;
00104
00105 if( _gsl->size != o._gsl->size )
00106 return( false );
00107
00108 for( int i = 0; i < _gsl->size && ret; i++ )
00109 ret = ret && ( _gsl->data[ i ] != o._gsl->data[ i ] );
00110 return( ret );
00111 }
00112
00113
00114 gslobj_vector gslobj_vector::operator+( const gslobj_vector& o )
00115 {
00116 gslobj_vector r( *this );
00117 gsl_vector_add( r._gsl, o._gsl );
00118 return( r );
00119 }
00120
00121
00122 gslobj_vector gslobj_vector::operator+( double o )
00123 {
00124 gslobj_vector r( *this );
00125 gsl_vector_add_constant( r._gsl, o );
00126 return( r );
00127 }
00128
00129
00130 gslobj_vector gslobj_vector::operator+( double* o )
00131 {
00132 gslobj_vector r( *this );
00133 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
00134 gsl_vector_add( r._gsl, &( vw.vector ) );
00135 return( r );
00136 }
00137
00138
00139 gslobj_vector gslobj_vector::operator+( gsl_vector* o )
00140 {
00141 gslobj_vector r( *this );
00142 gsl_vector_add( r._gsl, o );
00143 return( r );
00144 }
00145
00146
00147 gslobj_vector& gslobj_vector::operator+=( const gslobj_vector& o )
00148 {
00149 gsl_vector_add( _gsl, o._gsl );
00150 return( *this );
00151 }
00152
00153
00154 gslobj_vector& gslobj_vector::operator+=( double o )
00155 {
00156 gsl_vector_add_constant( _gsl, o );
00157 return( *this );
00158 }
00159
00160
00161 gslobj_vector& gslobj_vector::operator+=( double* o )
00162 {
00163 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
00164 gsl_vector_add( _gsl, &( vw.vector ) );
00165 return( *this );
00166 }
00167
00168
00169 gslobj_vector& gslobj_vector::operator+=( gsl_vector* o )
00170 {
00171 gsl_vector_add( _gsl, o );
00172 return( *this );
00173 }
00174
00175
00176 gslobj_vector gslobj_vector::operator-( const gslobj_vector& o )
00177 {
00178 gslobj_vector r( *this );
00179 gsl_vector_sub( r._gsl, o._gsl );
00180 return( r );
00181 }
00182
00183
00184 gslobj_vector gslobj_vector::operator-( double o )
00185 {
00186 gslobj_vector r( *this );
00187 gsl_vector_add_constant( r._gsl, -o );
00188 return( r );
00189 }
00190
00191
00192 gslobj_vector gslobj_vector::operator-( double* o )
00193 {
00194 gslobj_vector r( *this );
00195 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
00196 gsl_vector_sub( r._gsl, &( vw.vector ) );
00197 return( r );
00198 }
00199
00200
00201 gslobj_vector gslobj_vector::operator-( gsl_vector* o )
00202 {
00203 gslobj_vector r( *this );
00204 gsl_vector_sub( r._gsl, o );
00205 return( r );
00206 }
00207
00208
00209 gslobj_vector& gslobj_vector::operator-=( const gslobj_vector& o )
00210 {
00211 gsl_vector_sub( _gsl, o._gsl );
00212 return( *this );
00213 }
00214
00215
00216 gslobj_vector& gslobj_vector::operator-=( double o )
00217 {
00218 gsl_vector_add_constant( _gsl, -o );
00219 return( *this );
00220 }
00221
00222
00223 gslobj_vector& gslobj_vector::operator-=( double* o )
00224 {
00225 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
00226 gsl_vector_sub( _gsl, &( vw.vector ) );
00227 return( *this );
00228 }
00229
00230
00231 gslobj_vector& gslobj_vector::operator-=( gsl_vector* o )
00232 {
00233 gsl_vector_sub( _gsl, o );
00234 return( *this );
00235 }
00236
00237
00238 gslobj_vector gslobj_vector::operator*( double o )
00239 {
00240 gslobj_vector r( *this );
00241 gsl_vector_scale( r._gsl, o );
00242 return( r );
00243 }
00244
00245
00246 gslobj_vector& gslobj_vector::operator*=( double o )
00247 {
00248 gsl_vector_scale( _gsl, o );
00249 return( *this );
00250 }
00251
00252
00253 double gslobj_vector::dot( const gslobj_vector& o )
00254 {
00255 double r;
00256 gsl_blas_ddot( _gsl, o._gsl, &r );
00257 return( r );
00258 }
00259
00260
00261 double gslobj_vector::dot( double* o )
00262 {
00263 double r;
00264 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
00265 gsl_blas_ddot( _gsl, &( vw.vector ), &r );
00266 return( r );
00267 }
00268
00269
00270 double gslobj_vector::dot( gsl_vector* o )
00271 {
00272 double r;
00273 gsl_blas_ddot( _gsl, o, &r );
00274 return( r );
00275 }
00276
00277
00278 gslobj_vector gslobj_vector::cross( const gslobj_vector& o )
00279 {
00280 return( cross( o._gsl->data ) );
00281 }
00282
00283
00284 gslobj_vector gslobj_vector::cross( double* o )
00285 {
00286 gslobj_vector r( *this );
00287 double S, s;
00288
00289
00290 S = _gsl->data[ 1 ] * o[ 2 ];
00291 s = _gsl->data[ 2 ] * o[ 1 ];
00292 r._gsl->data[ 0 ] = S - s;
00293
00294
00295 S = _gsl->data[ 2 ] * o[ 0 ];
00296 s = _gsl->data[ 0 ] * o[ 2 ];
00297 r._gsl->data[ 1 ] = S - s;
00298
00299
00300 S = _gsl->data[ 0 ] * o[ 1 ];
00301 s = _gsl->data[ 1 ] * o[ 0 ];
00302 r._gsl->data[ 2 ] = S - s;
00303 return( r );
00304 }
00305
00306
00307 gslobj_vector gslobj_vector::cross( gsl_vector* o )
00308 {
00309 return( cross( o->data ) );
00310 }
00311
00312
00313 int gslobj_vector::scross( const gslobj_vector& o )
00314 {
00315 *this = cross( o );
00316 return( 1 );
00317 }
00318
00319
00320 int gslobj_vector::scross( double* o )
00321 {
00322 *this = cross( o );
00323 return( 1 );
00324 }
00325
00326
00327 int gslobj_vector::scross( gsl_vector* o )
00328 {
00329 *this = cross( o );
00330 return( 1 );
00331 }
00332
00333
00334 gslobj_vector gslobj_vector::operator/( double o )
00335 {
00336 gslobj_vector r( *this );
00337 gsl_vector_scale( r._gsl, 1.0 / o );
00338 return( r );
00339 }
00340
00341
00342 gslobj_vector& gslobj_vector::operator/=( double o )
00343 {
00344 gsl_vector_scale( _gsl, 1.0 / o );
00345 return( *this );
00346 }
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 double gslobj_vector::norm2( )
00357 {
00358 return( gsl_blas_dnrm2( _gsl ) );
00359 }
00360
00361
00362 gslobj_vector gslobj_vector::normalize( )
00363 {
00364 gslobj_vector r( *this );
00365 gsl_vector_scale( r._gsl, 1.0 / gsl_blas_dnrm2( _gsl ) );
00366 return( r );
00367 }
00368
00369
00370 int gslobj_vector::snormalize( )
00371 {
00372 return( gsl_vector_scale( _gsl, 1.0 / gsl_blas_dnrm2( _gsl ) ) );
00373 }
00374
00375