Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/Beta/Math/Vector.hpp

Go to the documentation of this file.
00001 #ifndef __J2K__Vector_HPP__
00002 #define __J2K__Vector_HPP__
00003 
00004 #include <j2k/Fred/Basic.hpp>
00005 #include <j2k/Fred/Boolean.hpp>
00006 #include <j2k/Fred/StdTypes.hpp>
00007 
00008 // len==0 should throw NO DATA
00009 
00010 #define MC_Create_Vector( NAME, TYPE )                                     \
00011 class Vector ## NAME                                                       \
00012 {                                                                          \
00013 private:                                                                   \
00014     /* Data contained in class Vector */                                   \
00015     TYPE* data;                                                            \
00016                                                                            \
00017     /* Length of the vector */                                             \
00018     ULONG length;                                                          \
00019                                                                            \
00020     /*   Sets length of vector to newLen       */                          \
00021     /*   and copies data newData into vector.  */                          \
00022     void init( ULONG newLen, const TYPE* newData = NULL ) {                \
00023           empty();                                                         \
00024                                                                            \
00025         length = newLen;                                                   \
00026                                                                            \
00027         if ( newData != NULL ) {                                           \
00028           if ( length == 0 ) length++;                                     \
00029             data = new TYPE[ length ];                                     \
00030             assert( data != NULL );                                        \
00031                                                                            \
00032             /* Copy in new data from initialization */                     \
00033             memcpy( data, newData, length * sizeof( TYPE ) );              \
00034         }                                                                  \
00035      }                                                                     \
00036                                                                            \
00037 public:                                                                    \
00038   Vector ## NAME ## ( ULONG length = 0, const TYPE* newData = NULL )       \
00039     : data( NULL ), length( 0 )                                            \
00040   {                                                                        \
00041     init( length, newData );                                               \
00042   }                                                                        \
00043                                                                            \
00044   Vector ## NAME ## ( const Vector ## NAME ## & v )                        \
00045     : data( NULL ), length( 0 )                                            \
00046   {                                                                        \
00047     init( v.length, v.data );                                              \
00048   }                                                                        \
00049                                                                            \
00050   virtual ~Vector ## NAME ## () {                                          \
00051     empty();                                                               \
00052   }                                                                        \
00053                                                                            \
00054   Vector ## NAME ## & setLength( ULONG newLen ) {                          \
00055     init( newLen );                                                        \
00056     return *this;                                                          \
00057   }                                                                        \
00058                                                                            \
00059   BOOL isEmpty() const {                                                   \
00060     return ( data == NULL );                                               \
00061   }                                                                        \
00062                                                                            \
00063   /* Clear data members */                                                 \
00064   void empty() {                                                           \
00065     if ( data != NULL ) {                                                  \
00066       delete [] data;                                                      \
00067       data = NULL;                                                         \
00068     }                                                                      \
00069     length = 0;                                                            \
00070   }                                                                        \
00071                                                                            \
00072   ULONG length() const { return length; }                                  \
00073                                                                            \
00074   Vector ## NAME ## & operator=( const Vector ## NAME ## & v ) {           \
00075     if ( &v != this ) {                                                    \
00076       init( v.length, v.data );                                            \
00077     }                                                                      \
00078     return *this;                                                          \
00079   }                                                                        \
00080                                                                            \
00081   /* Set all elements of vector equal to a constant */                     \
00082   Vector ## NAME ## & operator=( const TYPE t ) {                          \
00083     TYPE *pt = data;                                                       \
00084     for ( int i = 0; i < length; i++ ) {                                   \
00085        *pt++ = t;                                                          \
00086     }                                                                      \
00087     return *this;                                                          \
00088   }                                                                        \
00089                                                                            \
00090   /* Return an element of the vector */                                    \
00091   TYPE& operator[]( ULONG element ) {                                      \
00092     assert( !isEmpty() );                                                  \
00093     assert( element < length );                                            \
00094     return data[element];                                                  \
00095   }                                                                        \
00096                                                                            \
00097   const TYPE operator[]( ULONG element ) const {                           \
00098     assert( !isEmpty() );                                                  \
00099     assert( element < length );                                            \
00100     return data[element];                                                  \
00101   }                                                                        \
00102                                                                            \
00103   /* Allow fast read-only access to data */                                \
00104   const TYPE* getData( ULONG len, ULONG b = 0 ) const {                    \
00105     assert( !isEmpty() );                                                  \
00106     assert( (b+len) < length );                                            \
00107     return &data[b];                                                       \
00108   }                                                                        \
00109                                                                            \
00110   /* Return a new read-only subvector of this vector */                    \
00111   const Vector ## NAME ## operator()( ULONG b, ULONG len ) const {         \
00112     assert( !isEmpty() );                                                  \
00113     assert( (b+len) < length );                                            \
00114                                                                            \
00115     /* Verify this !!! */                                                  \
00116                                                                            \
00117     Vector ## NAME                                                         \
00118       vRet( len, &data[b] );                                               \
00119                                                                            \
00120     return vRet;                                                           \
00121   }                                                                        \
00122                                                                            \
00123 };                                                                         \
00124                                                                            \
00125 /* Add two vectors, v = v1 + v2 */                                         \
00126 Vector ## NAME ## add( const Vector ## NAME ## & v1,                       \
00127                        const Vector ## NAME ## & v2 )                      \
00128 {                                                                          \
00129   ULONG len = min( v1.length(), v2.length() );                             \
00130   if ( len == 0 ) len++                                                    \
00131                                                                            \
00132   Vector ## NAME                                                           \
00133      vRet( len );                                                          \
00134                                                                            \
00135   for ( ULONG i = 0; i < len; i++ ) {                                      \
00136      vRet[i] = v1[i] + v2[i];                                              \
00137   }                                                                        \
00138                                                                            \
00139   return vRet;                                                             \
00140 }                                                                          \
00141                                                                            \
00142 /* Substracts two vectors, v = v1 - v2 */                                  \
00143                                                                            \
00144 Vector ## NAME ## sub( const Vector ## NAME ## & v1,                       \
00145                        const Vector ## NAME ## & v2 )                      \
00146 {                                                                          \
00147   ULONG len = min( v1.length(), v2.length() );                             \
00148   if ( len == 0 ) len++;                                                   \
00149   Vector ## NAME                                                           \
00150     vRet( len );                                                           \
00151                                                                            \
00152   for ( ULONG i = 0; i < len; i++ ) {                                      \
00153       vRet[i] = v1[i] - v2[i];                                             \
00154   }                                                                        \
00155   return vRet;                                                             \
00156 }                                                                          \
00157                                                                            \
00158 /* Multiplies two vectors, v = v1 * v2 */                                  \
00159                                                                            \
00160 Vector ## NAME ## pwisemult( const Vector ## NAME ## & v1,                 \
00161                              const Vector ## NAME ## & v2 )                \
00162 {                                                                          \
00163   ULONG len = min( v1.length(), v2.length() );                             \
00164   if ( len == 0 ) len++;                                                   \
00165   Vector## NAME                                                            \
00166     vRet( len );                                                           \
00167   for ( ULONG i = 0; i < len; i++ ) {                                      \
00168      vRet[i] = v1[i] * v2[i];                                              \
00169   }                                                                        \
00170   return vRet;                                                             \
00171 }                                                                          \
00172                                                                            \
00173 /* Scalar DOT products of two vectors, v = v1 DOT v2 */                    \
00174                                                                            \
00175 TYPE mult( const Vector ## NAME ##& v1, const Vector ## NAME ## & v2 )     \
00176 {                                                                          \
00177   ULONG len = min( v1.length(), v2.length() );                             \
00178   if ( len == 0 ) len++;                                                   \
00179   TYPE t = (TYPE)0;                                                        \
00180   for ( ULONG i = 0; i < len; i++ ) {                                      \
00181      t += v1[i] * v2[i];                                                   \
00182   }                                                                        \
00183   return t;                                                                \
00184 }                                                                          \
00185                                                                            \
00186 /* Scalar sum of all elements of a vector, s = E( Vi ) */                  \
00187 TYPE sum( const Vector ## NAME ## & v )                                    \
00188 {                                                                          \
00189   ULONG len = v.length();                                                  \
00190   if ( len == 0 ) len++;                                                   \
00191   TYPE t = (TYPE)0;                                                        \
00192   for ( ULONG i = 0; i < len; i++ ) {                                      \
00193      t += v[i];                                                            \
00194   }                                                                        \
00195   return t;                                                                \
00196 }                                                                          \
00197                                                                            \
00198 /* Scales all elements of a vector by a float value. */                    \
00199 Vector ## NAME ## scale( float scale, const Vector ## NAME ## & v )        \
00200 {                                                                          \
00201   ULONG len = v.length();                                                  \
00202   if ( len == 0 ) len++;                                                   \
00203   Vector## NAME                                                            \
00204     vRet( len );                                                           \
00205                                                                            \
00206   for( ULONG i = 0; i < len; i++ ) {                                       \
00207     vRet[i] = (TYPE)(scale * v[i]);                                        \
00208   }                                                                        \
00209   return vRet;                                                             \
00210 }                                                                          \
00211                                                                            \
00212 ostream& operator<<( ostream& os, const Vector## NAME ##& v )              \
00213 {                                                                          \
00214   ULONG len = v.length();                                                  \
00215   os << "Vector<" << TYPEid( TYPE ).name();                                \
00216   os << ">( " << len << " )\n{";                                           \
00217                                                                            \
00218   if ( v.isEmpty() ) {                                                     \
00219     os << "\n};\n";                                                        \
00220   } else {                                                                 \
00221    os << "\n\t";                                                           \
00222     for( ULONG i = 0; i < len - 1; i++ ) {                                 \
00223       os << v[i] << ", ";                                                  \
00224     }                                                                      \
00225     os << v[i] << "\n};\n";                                                \
00226   }                                                                        \
00227   return os;                                                               \
00228 }                                                                          \
00229                                                                            \
00230 BOOL operator!=( const Vector## NAME ##& v1, const Vector## NAME ##& v2 )  \
00231 {                                                                          \
00232   if ( &v1 == &v2 )                                                        \
00233     return FALSE;                                                          \
00234                                                                            \
00235   if ( v1.length() != v2.length() )                                        \
00236     return TRUE;                                                           \
00237                                                                            \
00238   for ( ULONG i = 0; i < v1.length(); i++ )                                \
00239     if ( v1[i] != v2[i] )                                                  \
00240       return TRUE;                                                         \
00241                                                                            \
00242   return FALSE;                                                            \
00243 }                                                                          \
00244                                                                            \
00245 BOOL operator==( const Vector## NAME ##& v1, const Vector## NAME ##& v2 )  \
00246 {                                                                          \
00247   return ( ! ( v1 != v2 ) );                                               \
00248 }                                                                          \
00249                                                                             
00250 
00251 #endif
00252                                                                             
00253                                                                             

Generated on Sun Oct 14 18:46:14 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001