vector.cxx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   wxMaracas
00004   Module:    $RCSfile: vector.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 
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 /*==PS========================================
00061 void gslobj_vector::resize( size_t s )
00062 {
00063     if( _copy ) {
00064 
00065         if( s != size( ) )
00066             gsl_vector_free( _gsl );
00067         _gsl = gsl_vector_alloc( s );
00068 
00069     } // fi
00070 }
00071 ==PS========================================*/
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     // 1st element
00290     S = _gsl->data[ 1 ] * o[ 2 ];
00291     s = _gsl->data[ 2 ] * o[ 1 ];
00292     r._gsl->data[ 0 ] = S - s;
00293                 
00294     // 2nd element
00295     S = _gsl->data[ 2 ] * o[ 0 ];
00296     s = _gsl->data[ 0 ] * o[ 2 ];
00297     r._gsl->data[ 1 ] = S - s;
00298                 
00299     // 3rd element
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 /*==PS========================================
00350 double gslobj_vector::norm1( )
00351 {
00352     return( gsl_blas_dasum( _gsl ) );
00353 }
00354 ==PS========================================*/
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 // eof - gslobj_vector.cxx

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1