1 /*# ---------------------------------------------------------------------
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
6 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
7 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9 # This software is governed by the CeCILL-B license under French law and
10 # abiding by the rules of distribution of free software. You can use,
11 # modify and/ or redistribute the software under the terms of the CeCILL-B
12 # license as circulated by CEA, CNRS and INRIA at the following URL
13 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
14 # or in the file LICENSE.txt.
16 # As a counterpart to the access to the source code and rights to copy,
17 # modify and redistribute granted by the license, users are provided only
18 # with a limited warranty and the software's author, the holder of the
19 # economic rights, and the successive licensors have only limited
22 # The fact that you are presently reading this means that you have had
23 # knowledge of the CeCILL-B license and that you accept its terms.
24 # ------------------------------------------------------------------------ */
26 /*=========================================================================
29 Module: $RCSfile: vector.cxx,v $
31 Date: $Date: 2012/11/15 14:15:31 $
32 Version: $Revision: 1.2 $
34 Copyright: (c) 2002, 2003
37 This software is distributed WITHOUT ANY WARRANTY; without even
38 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
39 PURPOSE. See the above copyright notice for more information.
41 =========================================================================*/
45 #include <gsl/gsl_blas.h>
47 // ---------------------------------------------------------------------
48 std::ostream& operator<<( std::ostream& os, const gslobj_vector& v )
50 for( int i = 0; i < v.size( ); i++ ) os << " " << v( i );
54 // ---------------------------------------------------------------------
55 gslobj_vector::gslobj_vector( size_t s )
58 _gsl = gsl_vector_alloc( s );
61 // ---------------------------------------------------------------------
62 gslobj_vector::gslobj_vector( const gslobj_vector& v )
65 _gsl = gsl_vector_alloc( v._gsl->size );
66 gsl_vector_memcpy( _gsl, v._gsl );
69 // ---------------------------------------------------------------------
70 gslobj_vector::gslobj_vector( double* v, size_t s )
73 _view = gsl_vector_view_array( v, s );
74 _gsl = &( _view.vector );
77 // ---------------------------------------------------------------------
78 gslobj_vector::gslobj_vector( gsl_vector* v )
84 // ---------------------------------------------------------------------
85 /*==PS========================================
86 void gslobj_vector::resize( size_t s )
91 gsl_vector_free( _gsl );
92 _gsl = gsl_vector_alloc( s );
96 ==PS========================================*/
97 // ---------------------------------------------------------------------
98 gslobj_vector& gslobj_vector::operator=( const gslobj_vector& o )
100 gsl_vector_memcpy( _gsl, o._gsl );
104 // ---------------------------------------------------------------------
105 gslobj_vector& gslobj_vector::operator=( double o )
107 gsl_vector_set_all( _gsl, o );
111 // ---------------------------------------------------------------------
112 gslobj_vector& gslobj_vector::operator=( double* o )
114 memcpy( _gsl->data, o, _gsl->size * sizeof( double ) );
118 // ---------------------------------------------------------------------
119 gslobj_vector& gslobj_vector::operator=( gsl_vector* o )
121 gsl_vector_memcpy( _gsl, o );
125 // ---------------------------------------------------------------------
126 bool gslobj_vector::operator==( const gslobj_vector& o ) const
130 if( _gsl->size != o._gsl->size )
133 for( int i = 0; i < _gsl->size && ret; i++ )
134 ret = ret && ( _gsl->data[ i ] != o._gsl->data[ i ] );
138 // ---------------------------------------------------------------------
139 gslobj_vector gslobj_vector::operator+( const gslobj_vector& o )
141 gslobj_vector r( *this );
142 gsl_vector_add( r._gsl, o._gsl );
146 // ---------------------------------------------------------------------
147 gslobj_vector gslobj_vector::operator+( double o )
149 gslobj_vector r( *this );
150 gsl_vector_add_constant( r._gsl, o );
154 // ---------------------------------------------------------------------
155 gslobj_vector gslobj_vector::operator+( double* o )
157 gslobj_vector r( *this );
158 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
159 gsl_vector_add( r._gsl, &( vw.vector ) );
163 // ---------------------------------------------------------------------
164 gslobj_vector gslobj_vector::operator+( gsl_vector* o )
166 gslobj_vector r( *this );
167 gsl_vector_add( r._gsl, o );
171 // ---------------------------------------------------------------------
172 gslobj_vector& gslobj_vector::operator+=( const gslobj_vector& o )
174 gsl_vector_add( _gsl, o._gsl );
178 // ---------------------------------------------------------------------
179 gslobj_vector& gslobj_vector::operator+=( double o )
181 gsl_vector_add_constant( _gsl, o );
185 // ---------------------------------------------------------------------
186 gslobj_vector& gslobj_vector::operator+=( double* o )
188 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
189 gsl_vector_add( _gsl, &( vw.vector ) );
193 // ---------------------------------------------------------------------
194 gslobj_vector& gslobj_vector::operator+=( gsl_vector* o )
196 gsl_vector_add( _gsl, o );
200 // ---------------------------------------------------------------------
201 gslobj_vector gslobj_vector::operator-( const gslobj_vector& o )
203 gslobj_vector r( *this );
204 gsl_vector_sub( r._gsl, o._gsl );
208 // ---------------------------------------------------------------------
209 gslobj_vector gslobj_vector::operator-( double o )
211 gslobj_vector r( *this );
212 gsl_vector_add_constant( r._gsl, -o );
216 // ---------------------------------------------------------------------
217 gslobj_vector gslobj_vector::operator-( double* o )
219 gslobj_vector r( *this );
220 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
221 gsl_vector_sub( r._gsl, &( vw.vector ) );
225 // ---------------------------------------------------------------------
226 gslobj_vector gslobj_vector::operator-( gsl_vector* o )
228 gslobj_vector r( *this );
229 gsl_vector_sub( r._gsl, o );
233 // ---------------------------------------------------------------------
234 gslobj_vector& gslobj_vector::operator-=( const gslobj_vector& o )
236 gsl_vector_sub( _gsl, o._gsl );
240 // ---------------------------------------------------------------------
241 gslobj_vector& gslobj_vector::operator-=( double o )
243 gsl_vector_add_constant( _gsl, -o );
247 // ---------------------------------------------------------------------
248 gslobj_vector& gslobj_vector::operator-=( double* o )
250 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
251 gsl_vector_sub( _gsl, &( vw.vector ) );
255 // ---------------------------------------------------------------------
256 gslobj_vector& gslobj_vector::operator-=( gsl_vector* o )
258 gsl_vector_sub( _gsl, o );
262 // ---------------------------------------------------------------------
263 gslobj_vector gslobj_vector::operator*( double o )
265 gslobj_vector r( *this );
266 gsl_vector_scale( r._gsl, o );
270 // ---------------------------------------------------------------------
271 gslobj_vector& gslobj_vector::operator*=( double o )
273 gsl_vector_scale( _gsl, o );
277 // ---------------------------------------------------------------------
278 double gslobj_vector::dot( const gslobj_vector& o )
281 gsl_blas_ddot( _gsl, o._gsl, &r );
285 // ---------------------------------------------------------------------
286 double gslobj_vector::dot( double* o )
289 gsl_vector_view vw = gsl_vector_view_array( o, _gsl->size );
290 gsl_blas_ddot( _gsl, &( vw.vector ), &r );
294 // ---------------------------------------------------------------------
295 double gslobj_vector::dot( gsl_vector* o )
298 gsl_blas_ddot( _gsl, o, &r );
302 // ---------------------------------------------------------------------
303 gslobj_vector gslobj_vector::cross( const gslobj_vector& o )
305 return( cross( o._gsl->data ) );
308 // ---------------------------------------------------------------------
309 gslobj_vector gslobj_vector::cross( double* o )
311 gslobj_vector r( *this );
315 S = _gsl->data[ 1 ] * o[ 2 ];
316 s = _gsl->data[ 2 ] * o[ 1 ];
317 r._gsl->data[ 0 ] = S - s;
320 S = _gsl->data[ 2 ] * o[ 0 ];
321 s = _gsl->data[ 0 ] * o[ 2 ];
322 r._gsl->data[ 1 ] = S - s;
325 S = _gsl->data[ 0 ] * o[ 1 ];
326 s = _gsl->data[ 1 ] * o[ 0 ];
327 r._gsl->data[ 2 ] = S - s;
331 // ---------------------------------------------------------------------
332 gslobj_vector gslobj_vector::cross( gsl_vector* o )
334 return( cross( o->data ) );
337 // ---------------------------------------------------------------------
338 int gslobj_vector::scross( const gslobj_vector& o )
344 // ---------------------------------------------------------------------
345 int gslobj_vector::scross( double* o )
351 // ---------------------------------------------------------------------
352 int gslobj_vector::scross( gsl_vector* o )
358 // ---------------------------------------------------------------------
359 gslobj_vector gslobj_vector::operator/( double o )
361 gslobj_vector r( *this );
362 gsl_vector_scale( r._gsl, 1.0 / o );
366 // ---------------------------------------------------------------------
367 gslobj_vector& gslobj_vector::operator/=( double o )
369 gsl_vector_scale( _gsl, 1.0 / o );
373 // ---------------------------------------------------------------------
374 /*==PS========================================
375 double gslobj_vector::norm1( )
377 return( gsl_blas_dasum( _gsl ) );
379 ==PS========================================*/
380 // ---------------------------------------------------------------------
381 double gslobj_vector::norm2( )
383 return( gsl_blas_dnrm2( _gsl ) );
386 // ---------------------------------------------------------------------
387 gslobj_vector gslobj_vector::normalize( )
389 gslobj_vector r( *this );
390 gsl_vector_scale( r._gsl, 1.0 / gsl_blas_dnrm2( _gsl ) );
394 // ---------------------------------------------------------------------
395 int gslobj_vector::snormalize( )
397 return( gsl_vector_scale( _gsl, 1.0 / gsl_blas_dnrm2( _gsl ) ) );
400 // eof - gslobj_vector.cxx