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