1 ////////////////////////////////////////////////////////////////////////////////
3 // Creation : 24/02/2000
4 // Author : Leonardo FLOREZ VALENCIA
5 // l-florez@uniandes.edu.co
6 // lflorez@creatis.insa-lyon.fr
7 // Copyright (C) 2000-2002 Leonardo FLOREZ VALENCIA
9 // This program is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU General Public License
11 // as published by the Free Software Foundation; either version 2
12 // of the License, or (at your option) any later version.
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
19 // You should have received a copy of the GNU General Public License
20 // along with this program; if not, write to the Free Software
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 ////////////////////////////////////////////////////////////////////////////////
24 #ifndef GTMLIB__MATH__VECTOR__HXX
25 #define GTMLIB__MATH__VECTOR__HXX
32 #define ROW_VECTOR 0x01
33 #define COL_VECTOR 0x02
43 * This class defines a C++ template to use mathematical vectors
54 * @param N Cardinality.
55 * @param data Initial data.
56 * @param type Vector type (ROW_VECTOR/COL_VECTOR).
57 * @param r Right object (vector or matrix).
58 * @param block ANSI array.
59 * @param copy Make a copy of given array?
62 /// Default constructor.
63 TVector( uint N = 3, T data = ( T )0, int type = COL_VECTOR );
65 TVector( const TVector< T >& r );
66 /// Use this to treat an ANSI array as a TVector.
67 TVector( T* block, uint N, bool copy = true, int type = COL_VECTOR );
72 if( _myMemory ) VectorFreeMemory< T >( _vector );
78 /** Assignation operators.
80 * @param r Right object (vector or matrix).
83 /// Vector assignation.
84 TVector< T >& operator=( const TVector< T >& r );
85 /// Matrix assignation (defined in class TMatrix).
86 TVector< T >& operator=( TMatrix< T >& r );
87 /// ANSI assignation (r size must be, at least, N).
88 TVector< T >& operator=( T* r ) {
89 VectorAssignMemory< T >( _vector, r, _N );
92 /// Scalar assignation.
93 TVector< T >& operator=( T r ) {
94 VectorAssignScalar< T >( _vector, r, _N );
99 /** Comparation operators.
101 * @param r Right object.
105 bool operator==( const TVector< T >& r );
107 bool operator!=( const TVector< T >& r );
110 /// Reference operator.
111 T& operator()( uint i ) {
112 return( _vector[ i ] );
114 /// ANSI (C/C++ array) reference.
118 /// Vector's cardinality.
122 /// Vector's type (ROW_VECTOR/COL_VECTOR).
126 /// Mathematical norm (L2).
128 return( VectorNorm< T >( _vector, _N ) );
130 /// Normalizes the vector.
132 VectorNormalize< T >( _vector, _vector, _N );
135 T Dot( const TVector< T >& r ) {
136 return( VectorDotProduct< T >( _vector, r._vector, GTM_MIN( _N, r._N ) ) );
139 /** Binary operators.
141 * @param r Right object (vector, matrix or scalar).
145 TVector< T > operator+( const TVector< T >& r );
147 TVector< T > operator-( const TVector< T >& r );
149 TVector< T > operator*( const TVector< T >& r );
150 /// Matrix product (defined in class TMatrix).
151 TMatrix< T > operator*( TMatrix< T >& r );
153 TVector< T > operator*( T r );
156 /** Self-assignation binary operators.
158 * @param r Right object (vector, matrix or scalar).
162 TVector< T >& operator+=( const TVector< T >& r ) {
167 TVector< T >& operator-=( const TVector< T >& r ) {
172 TVector< T >& operator*=( const TVector< T >& r ) {
177 TVector< T >& operator*=( T r ) {
185 /// Additive inverse.
186 TVector< T > operator-( );
187 /// Normalized vector.
188 TVector< T > operator!( );
189 /// Transposed vector.
190 TVector< T > operator~( );
195 /// Vector's internal state.
201 /// Type (ROW_VECTOR/COL_VECTOR).
203 /// Have I created _vector?
209 // -----------------------------------------------------------------------------
211 TVector< T >::TVector( uint N, T data, int type )
215 _vector = VectorAllocateMemory< T >( _N );
217 VectorAssignScalar< T >( _vector, data, _N );
221 // -----------------------------------------------------------------------------
223 TVector< T >::TVector( const TVector< T >& r )
228 _vector = VectorCopyMemory< T >( r._vector, _N );
232 // -----------------------------------------------------------------------------
234 TVector< T >::TVector( T* block, uint N, bool copy, int type )
239 _vector = ( copy )? VectorCopyMemory< T >( block, _N ): block;
243 // -----------------------------------------------------------------------------
245 void TVector< T >::SetN( uint N )
247 if( _myMemory ) VectorFreeMemory< T >( _vector );
249 _vector = VectorAllocateMemory< T >( _N );
251 VectorAssignScalar< T >( _vector, ( T )0, _N );
255 // -----------------------------------------------------------------------------
257 TVector< T >& TVector< T >::operator=( const TVector< T >& r )
260 * Only assigns the minimum cardinality (WARNING WITH NON-LOCAL MEMORY).
263 VectorAssignMemory< T >( _vector, r._vector, GTM_MIN( _N, r._N ) );
268 // -----------------------------------------------------------------------------
270 bool TVector< T >::operator==( const TVector< T >& r )
276 i = 0, ret = ( _N == r._N );
278 ret &= ( _vector[ i ] == r._vector[ i ] ), i++
284 // -----------------------------------------------------------------------------
286 bool TVector< T >::operator!=( const TVector< T >& r )
292 i = 0, ret = ( _N != r._N );
294 ret |= ( _vector[ i ] != r._vector[ i ] ), i++
300 // -----------------------------------------------------------------------------
302 TVector< T > TVector< T >::operator+( const TVector< T >& r )
304 TVector< T > ret( GTM_MIN( _N, r._N ) );
306 VectorAdd< T >( ret._vector, _vector, r._vector, GTM_MIN( _N, r._N ) );
311 // -----------------------------------------------------------------------------
313 TVector< T > TVector< T >::operator-( const TVector< T >& r )
315 TVector< T > ret( GTM_MIN( _N, r._N ) );
317 VectorSubtract< T >( ret._vector, _vector, r._vector, GTM_MIN( _N, r._N ) );
322 // -----------------------------------------------------------------------------
324 TVector< T > TVector< T >::operator*( const TVector< T >& r )
326 TVector< T > ret( GTM_MIN( _N, r._N ) );
328 VectorCrossProduct< T >( ret._vector, _vector, r._vector );
333 // -----------------------------------------------------------------------------
335 TVector< T > TVector< T >::operator*( T r )
337 TVector< T > ret( _N );
339 VectorScalarProduct< T >( ret._vector, _vector, r, _N );
344 // -----------------------------------------------------------------------------
346 TVector< T > TVector< T >::operator-( )
348 TVector< T > ret( _N );
351 for( i = 0; i < _N; ret._vector[ i ] = ( T )0 - _vector[ i ], i++ );
356 // -----------------------------------------------------------------------------
358 TVector< T > TVector< T >::operator!( )
360 TVector< T > ret( _N );
362 VectorNormalize< T >( ret._vector, _vector, _N );
367 // -----------------------------------------------------------------------------
369 TVector< T > TVector< T >::operator~( )
371 TVector< T > ret = *this;
373 ret._type = ( _type == COL_VECTOR )? ROW_VECTOR: COL_VECTOR;
380 #endif // GTMLIB__MATH__VECTOR__HXX