/vol/vipdata/irtk/geometry++/include/irtkVector.h

00001 /*=========================================================================
00002 
00003   Library   : Image Registration Toolkit (IRTK)
00004   Module    : $Id: irtkVector.h 2 2008-12-23 12:40:14Z dr $
00005   Copyright : Imperial College, Department of Computing
00006               Visual Information Processing (VIP), 2008 onwards
00007   Date      : $Date: 2008-12-23 12:40:14 +0000 (Tue, 23 Dec 2008) $
00008   Version   : $Revision: 2 $
00009   Changes   : $Author: dr $
00010 
00011 =========================================================================*/
00012 
00013 #ifndef _IRTKVECTOR_H
00014 
00015 #define _IRTKVECTOR_H
00016 
00017 #ifdef USE_VXL
00018 // VXL header file was loaded in irtkMatrix.h
00019 #include <vnl/vnl_diag_matrix.h>
00020 #endif
00021 
00028 class irtkVector : public irtkObject
00029 {
00030 
00031 protected:
00032 
00034   int _rows;
00035 
00037   double *_vector;
00038 
00039 public:
00040 
00042   irtkVector();
00043 
00045   irtkVector(int);
00046 
00048   irtkVector(const irtkVector &);
00049 
00051   ~irtkVector();
00052 
00054   void Initialize(int);
00055 
00056   //
00057   // Vector access functions
00058   //
00059 
00061   int Rows() const;
00062 
00064   void   Put(int, double);
00065 
00067   double Get(int) const;
00068 
00069   //
00070   // Operators for vector access
00071   //
00072 
00074   double &operator()(int);
00075 
00077   double  operator()(int) const;
00078 
00079   //
00080   // Vector operators for doubles
00081   //
00082 
00084   irtkVector& operator-=(double);
00085 
00087   irtkVector& operator+=(double);
00088 
00090   irtkVector& operator*=(double);
00091 
00093   irtkVector& operator/=(double);
00094 
00096   irtkVector  operator- (double);
00097 
00099   irtkVector  operator+ (double);
00100 
00102   irtkVector  operator* (double);
00103 
00105   irtkVector  operator/ (double);
00106 
00107   //
00108   // Vector operators for vectors
00109   //
00110 
00112   irtkVector& operator =(const irtkVector&);
00113 
00115   irtkVector& operator-=(const irtkVector&);
00116 
00118   irtkVector& operator+=(const irtkVector&);
00119 
00121   irtkVector& operator*=(const irtkVector&);
00122 
00124   irtkVector& operator/=(const irtkVector&);
00125 
00127   irtkVector  operator- (const irtkVector&);
00128 
00130   irtkVector  operator+ (const irtkVector&);
00131 
00133   irtkVector  operator* (const irtkVector&);
00134 
00136   irtkVector  operator/ (const irtkVector&);
00137 
00139   Bool operator==(const irtkVector &);
00140 
00141 #ifndef USE_STL
00143   Bool operator!=(const irtkVector &);
00144 #endif
00145 
00147   Bool operator<(const irtkVector &);
00148 
00150   double ScalarProduct(const irtkVector&);
00151 
00153   irtkVector CrossProduct(const irtkVector&);
00154 
00156   double Norm(void) const;
00157 
00159   void   Normalize(void);
00160 
00161   //
00162   // Vector in- and output
00163   //
00164 
00166   friend ostream& operator<< (ostream&, const irtkVector&);
00167 
00169   friend istream& operator>> (istream&, irtkVector&);
00170 
00172   void Print();
00173 
00175   void Read (char *);
00176 
00178   void Write(char *);
00179 
00180 
00181 #ifdef USE_VXL
00183   template <class T> void Vector2Vnl(vnl_diag_matrix<T>*) const;
00184 
00186   template <class T> void Vnl2Vector(vnl_diag_matrix<T>*);
00187 
00188 #else
00190   void Vector2NR(float *) const;
00191   void Vector2NR(double *) const;
00192 
00194   void NR2Vector(float *);
00195   void NR2Vector(double *);
00196 #endif
00197 
00198 };
00199 
00200 //
00201 // Access operators
00202 //
00203 
00204 inline int irtkVector::Rows() const
00205 {
00206   return _rows;
00207 }
00208 
00209 inline void irtkVector::Put(int rows, double vector)
00210 {
00211   _vector[rows] = vector;
00212 }
00213 
00214 inline double irtkVector::Get(int rows) const
00215 {
00216   return _vector[rows];
00217 }
00218 
00219 inline double& irtkVector::operator()(int rows)
00220 {
00221   return _vector[rows];
00222 }
00223 
00224 inline double irtkVector::operator()(int rows) const
00225 {
00226   return _vector[rows];
00227 }
00228 
00229 //
00230 // Vector operators for doubles
00231 //
00232 
00233 inline irtkVector& irtkVector::operator-=(double x)
00234 {
00235   int i;
00236 
00237   for (i = 0; i < _rows; i++) {
00238     _vector[i] -= x;
00239   }
00240 
00241   return *this;
00242 }
00243 
00244 inline irtkVector& irtkVector::operator+=(double x)
00245 {
00246   int i;
00247 
00248   for (i = 0; i < _rows; i++) {
00249     _vector[i] += x;
00250   }
00251 
00252   return *this;
00253 }
00254 
00255 inline irtkVector& irtkVector::operator*=(double x)
00256 {
00257   int i;
00258 
00259   for (i = 0; i < _rows; i++) {
00260     _vector[i] *= x;
00261   }
00262 
00263   return *this;
00264 }
00265 
00266 inline irtkVector& irtkVector::operator/=(double x)
00267 {
00268   int i;
00269 
00270   for (i = 0; i < _rows; i++) {
00271     _vector[i] /= x;
00272   }
00273 
00274   return *this;
00275 }
00276 
00277 inline irtkVector irtkVector::operator- (double x)
00278 {
00279   int i;
00280 
00281   irtkVector m(_rows);
00282   for (i = 0; i < _rows; i++) {
00283     m._vector[i] = _vector[i] - x;
00284   }
00285   return m;
00286 }
00287 
00288 inline irtkVector irtkVector::operator+ (double x)
00289 {
00290   int i;
00291 
00292   irtkVector m(_rows);
00293   for (i = 0; i < _rows; i++) {
00294     m._vector[i] = _vector[i] + x;
00295   }
00296   return m;
00297 }
00298 
00299 inline irtkVector irtkVector::operator* (double x)
00300 {
00301   int i;
00302 
00303   irtkVector m(_rows);
00304   for (i = 0; i < _rows; i++) {
00305     m._vector[i] = _vector[i] * x;
00306   }
00307   return m;
00308 }
00309 
00310 inline irtkVector irtkVector::operator/ (double x)
00311 {
00312   int i;
00313 
00314   irtkVector m(_rows);
00315   for (i = 0; i < _rows; i++) {
00316     m._vector[i] = _vector[i] / x;
00317   }
00318   return m;
00319 }
00320 
00321 //
00322 // Vector operators for vectors
00323 //
00324 
00325 inline irtkVector& irtkVector::operator =(const irtkVector& v)
00326 {
00327   int i;
00328 
00329   // Copy size
00330   this->Initialize(v._rows);
00331 
00332   // Copy vector
00333   for (i = 0; i < _rows; i++) {
00334     _vector[i] = v._vector[i];
00335   }
00336   return *this;
00337 }
00338 
00339 inline irtkVector& irtkVector::operator-=(const irtkVector& v)
00340 {
00341   int i;
00342 
00343   if (_rows != v._rows) {
00344     cerr << "irtkVector::operator-=: Size mismatch" << endl;
00345     exit(1);
00346   }
00347   for (i = 0; i < _rows; i++) {
00348     _vector[i] -= v._vector[i];
00349   }
00350 
00351   return *this;
00352 }
00353 
00354 inline irtkVector& irtkVector::operator+=(const irtkVector& v)
00355 {
00356   int i;
00357 
00358   if (_rows != v._rows) {
00359     cerr << "irtkVector::operator+=: Size mismatch" << endl;
00360     exit(1);
00361   }
00362   for (i = 0; i < _rows; i++) {
00363     _vector[i] += v._vector[i];
00364   }
00365 
00366   return *this;
00367 }
00368 
00369 inline irtkVector& irtkVector::operator*=(const irtkVector& v)
00370 {
00371   int i;
00372 
00373   if (_rows != v._rows) {
00374     cerr << "irtkVector::operator*=: Size mismatch" << endl;
00375     exit(1);
00376   }
00377   for (i = 0; i < _rows; i++) {
00378     _vector[i] *= v._vector[i];
00379   }
00380 
00381   return *this;
00382 }
00383 
00384 inline irtkVector& irtkVector::operator/=(const irtkVector& v)
00385 {
00386   int i;
00387 
00388   if (_rows != v._rows) {
00389     cerr << "irtkVector::operator/=: Size mismatch" << endl;
00390     exit(1);
00391   }
00392   for (i = 0; i < _rows; i++) {
00393     _vector[i] /= v._vector[i];
00394   }
00395 
00396   return *this;
00397 }
00398 
00399 inline irtkVector irtkVector::operator- (const irtkVector& v)
00400 {
00401   int i;
00402 
00403   if (_rows != v._rows) {
00404     cerr << "irtkVector::operator-: Size mismatch" << endl;
00405     exit(1);
00406   }
00407   irtkVector m(_rows);
00408   for (i = 0; i < _rows; i++) {
00409     m._vector[i] = _vector[i] - v._vector[i];
00410   }
00411   return m;
00412 }
00413 
00414 inline irtkVector irtkVector::operator+ (const irtkVector& v)
00415 {
00416   int i;
00417 
00418   if (_rows != v._rows) {
00419     cerr << "irtkVector::operator+: Size mismatch" << endl;
00420     exit(1);
00421   }
00422   irtkVector m(_rows);
00423   for (i = 0; i < _rows; i++) {
00424     m._vector[i] = _vector[i] + v._vector[i];
00425   }
00426   return m;
00427 }
00428 
00429 inline irtkVector irtkVector::operator* (const irtkVector& v)
00430 {
00431   int i;
00432 
00433   if (_rows != v._rows) {
00434     cerr << "irtkVector::operator*: Size mismatch" << endl;
00435     exit(1);
00436   }
00437   irtkVector m(_rows);
00438   for (i = 0; i < _rows; i++) {
00439     m._vector[i] = _vector[i] * v._vector[i];
00440   }
00441   return m;
00442 }
00443 
00444 inline irtkVector irtkVector::operator/ (const irtkVector& v)
00445 {
00446   int i;
00447 
00448   if (_rows != v._rows) {
00449     cerr << "irtkVector::operator/: Size mismatch" << endl;
00450     exit(1);
00451   }
00452   irtkVector m(_rows);
00453   for (i = 0; i < _rows; i++) {
00454     m._vector[i] = _vector[i] / v._vector[i];
00455   }
00456   return m;
00457 }
00458 
00459 //
00460 // Comparison
00461 //
00462 
00463 inline Bool  irtkVector::operator==(const irtkVector &v)
00464 {
00465   if (_rows != v._rows) {
00466     return False;
00467   }
00468   for (int i = 0; i < _rows; i++) {
00469     if (_vector[i] != v._vector[i]) return False;
00470   }
00471   return True;
00472 
00473 }
00474 
00475 #ifndef USE_STL
00476 inline Bool  irtkVector::operator!=(const irtkVector &v)
00477 {
00478   if (_rows != v._rows) {
00479     return True;
00480   }
00481   for (int i = 0; i < _rows; i++) {
00482     if (_vector[i] != v._vector[i]) return True;
00483   }
00484   return False;
00485 }
00486 #endif
00487 
00488 inline Bool  irtkVector::operator<(const irtkVector &v)
00489 {
00490   if (_rows > v._rows) {
00491     return False;
00492   }
00493   for (int i = 0; i < _rows; i++) {
00494     if (_vector[i] >= v._vector[i]) return False;
00495   }
00496   return True;
00497 
00498 }
00499 
00500 //
00501 // Vector products
00502 //
00503 
00504 inline double irtkVector::ScalarProduct(const irtkVector &v)
00505 {
00506   int i;
00507   double scalar_product=0;
00508 
00509   if (_rows != v._rows) {
00510     cerr << "irtkVector::ScalarProduct: Size mismatch" << endl;
00511     exit(1);
00512   }
00513 
00514   for (i = 0; i < _rows; i++) {
00515     scalar_product += _vector[i]*v._vector[i];
00516   }
00517   return scalar_product;
00518 }
00519 
00520 inline irtkVector irtkVector::CrossProduct(const irtkVector &v)
00521 {
00522   int i;
00523 
00524   if (_rows != v._rows) {
00525     cerr << "irtkVector::CrossProduct: Size mismatch" << endl;
00526     exit(1);
00527   }
00528 
00529   irtkVector m(_rows);
00530   for (i = 0; i < _rows; i++) {
00531     m._vector[i] = (_vector[(i+1)%_rows]*v._vector[(i+2)%_rows]-
00532                     _vector[(i+2)%_rows]*v._vector[(i+1)%_rows]);
00533   }
00534   return m;
00535 }
00536 
00537 
00538 //
00539 // Functions
00540 //
00541 
00542 inline double irtkVector::Norm(void) const
00543 {
00544   double norm = 0;
00545 
00546   for (int i = 0; i < _rows; i++) {
00547     norm += _vector[i]*_vector[i];
00548   }
00549   return sqrt(norm);
00550 }
00551 
00552 inline void irtkVector::Normalize(void)
00553 {
00554   double norm = Norm();
00555 
00556   if (norm != 0) {
00557     *this /= norm;
00558   }
00559 }
00560 
00561 #ifdef USE_VXL
00562 
00563 template <class T>
00564 inline void irtkVector::Vector2Vnl(vnl_diag_matrix<T>* m) const
00565 {
00566   unsigned i;
00567 
00568   for (i = 0; i < (unsigned) _rows; i++) {
00569     (*m)(i) = (T) _vector[i];
00570   }
00571 }
00572 
00573 template <class T>
00574 inline void irtkVector::Vnl2Vector(vnl_diag_matrix<T>* m)
00575 {
00576   unsigned i;
00577 
00578   for (i = 0; i < (unsigned) _rows; i++) {
00579     _vector[i] = (float) (*m)(i);
00580   }
00581 }
00582 
00583 #endif
00584 
00585 #endif
00586 
00587 
00588