⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vector.h

📁 moealib
💻 H
字号:
/******************************************************************************** *                                                                              * * -------------------  Class Template for Vector ------------------------------* *                                                                              * * We add a static Normalizer object to Vector class. If it exists, the range of* * each dimension of Vector can be normalized to [0, 1] as necessary.           * *                                                   xianming Chen, Aug, 2000   * *                                                   modified on Jan 13, 20001  * ********************************************************************************/#ifndef _VECTOR_H_#define _VECTOR_H_#include <iostream.h>#include <math.h>#include <assert.h>#include "Normalizer.h"  class Vector  { public:  enum nRel { SMALLER, EQUAL, BIGGER, INCOMPARABLE };       // numeric comparison.  friend ostream& operator<< (ostream& os, const nRel rel); };template<class T>  class VectorT : public Vector { public:  VectorT(int d=0) : dims(d), vector(d? new T[d] : 0) { }  VectorT(T *pv, int dimens) {vector=new T[dims=dimens]; for(int i=0;i<dims;i++) vector[i]=pv[i]; }  VectorT(const VectorT & other) : vector(NULL), dims(0) { copy(other); }  virtual  ~VectorT() { delete [] vector; }  void copy(const VectorT& org);   const VectorT& operator= (const VectorT& rhs) { copy(rhs); return *this; }  int  dimensions() const             { return dims; }  bool dimensions(int dms);           // reset dims, copy old values. ret true if dims changed.  T& operator[] (int idx)             { assert(idx>=0&&idx<dims); return vector[idx]; }  T operator[] (int idx) const        { assert(idx>=0&&idx<dims); return vector[idx]; }  static Normalizer* normalizer()                    { return _normalizer; }  static Normalizer* normalizer(Normalizer* pn)      { return _normalizer=pn; }  static Normalizer* normalizer(const Normalizer& n) { return normalizer(n.clone()); }  double distance(const VectorT & other) const;  double normalizedDistance(const VectorT & other) const;  nRel compare(const VectorT & other) const;  /*+++++++++++++++++++ NOTE: != means not comparable. ++++++++++++++++++++++++++++*/  bool operator!= (const VectorT &r) { return compare(r)==INCOMPARABLE? true:false; }  bool operator> (const VectorT  &r) { return compare(r)==BIGGER      ? true:false; }  bool operator< (const VectorT  &r) { return compare(r)==SMALLER     ? true:false; }  bool operator== (const VectorT &r) { return compare(r)==EQUAL       ? true:false; }  bool operator>= (const VectorT &r) { return *this > r || *this == r ; }  bool operator<= (const VectorT &r) { return *this < r || *this == r ; }  const VectorT& operator+= (const VectorT &r) { assert(dims==r.dims);       for(int i=0;i<dims;i++) vector[i] += r.vector[i]; return *this; }  friend ostream& operator<< <>  (ostream& os, const VectorT<T>& tuple); protected:  T* vector;  int dims;  static Normalizer* _normalizer;};template<class T>Normalizer* VectorT<T>::_normalizer = 0;template<class T>void VectorT<T>::copy(const VectorT& other) {  if(this == &other) return;  if(dims != other.dims) {    delete vector;    vector = new T [dims=other.dims];  }  for(int i=0; i<dims; i++)     vector[i] = other.vector[i];}template<class T>bool VectorT<T>::dimensions(int d) {  if(dims == d) return false;  T* old = vector; int _dims = dims;  vector = new T [dims=d];  for(int i=0; i<d && i<_dims; i++)    vector[i] = old[i];  delete old;  return true;}template<class T>Vector::nRel VectorT<T> :: compare(const VectorT& other) const {  assert(dims==other.dims);  bool bigger = false, smaller = false;   bool equal = false, indiff = false;  for(int i=0; !(indiff) && i<dims; i++) {    if(vector[i] > other.vector[i]) bigger  = true;    if(vector[i] < other.vector[i]) smaller = true;    indiff = (bigger && smaller);  }  if(indiff) return  INCOMPARABLE;  if(bigger) return  BIGGER;  if(smaller)return  SMALLER;  return             EQUAL;}template<class T>double VectorT<T> :: distance(const VectorT & other) const {  assert(dims==other.dims);  double sum = 0.0;  for(int i=0; i<dims; i++)    sum += (vector[i]-other.vector[i]) * (vector[i]-other.vector[i]);  return sqrt(sum);}template<class T>double VectorT<T> :: normalizedDistance(const VectorT & other) const {  assert(_normalizer);  assert(dims==other.dims);  double sum = 0.0; double scaled1, scaled2;  for(int i=0; i<dims; i++) {    scaled1 = _normalizer->a(i) * vector[i] + _normalizer->b(i);    scaled2 = _normalizer->a(i) * other.vector[i] + _normalizer->b(i);    assert(scaled1>=0 && scaled1 <=1 && scaled2>=0 && scaled2 <=1 );    sum += (scaled1 - scaled2) * (scaled1 - scaled2);  }  return sqrt(sum);}template<class T>ostream& operator<< (ostream& os, const VectorT<T>& tuple) {  os << "(" << tuple.vector[0];  for(int i=1; i<tuple.dims; i++)    os << ", " << tuple.vector[i];  os << ")";}inline ostream& operator<< (ostream& os, const Vector::nRel rel) {  switch(rel) {  case Vector::BIGGER  : os << "bigger than ";  break;  case Vector::SMALLER : os << "smaller than ";break;  case Vector::EQUAL   : os << "equal to ";     break;  default              : os << "incomparable to ";   }  return os;}inline Vector::nRel not(Vector::nRel rel) {   switch(rel) {  case Vector::BIGGER : return Vector::SMALLER;  case Vector::SMALLER: return Vector::BIGGER;  default             : return rel;  }}typedef VectorT<double>   dVector;typedef VectorT<int>      iVector;typedef VectorT<float>    fVector;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -