vector.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #ifndef _Vector__h_
  2. #define _Vector__h_
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <iostream.h>
  6. #include <iomanip.h>
  7. class Vector
  8. {
  9. friend class Matrix;
  10. friend class Matrix3d;
  11. friend ostream& operator<<(ostream&, const Vector&);
  12. friend istream& operator>>(istream&, Vector&);
  13. friend Vector operator*(double, const Vector&);
  14. friend double max(const Vector&);
  15. friend double min(const Vector&);
  16. public:
  17. Vector(int = 0);
  18. Vector(int, double);
  19. Vector(int, double*);
  20. Vector(const Vector&);
  21. ~Vector() { if(v) delete []v; }
  22. void free() { if(v) delete []v; }
  23. int dim() const { return d; }
  24. double* vec() const { return v; }
  25. Vector abs() const;
  26. Vector& resize(int);
  27. void swap_elem(int,int);
  28. Vector& operator=(const Vector&);
  29. double& operator[](int);
  30. double operator[](int) const;
  31. Vector operator+(const Vector&) const;
  32. Vector operator-(const Vector&) const;
  33. Vector& operator+=(const Vector&);
  34. Vector& operator-=(const Vector&);
  35. Vector& operator/=(double);
  36. Vector& operator*=(double);
  37. Vector operator*(double) const;
  38. Vector operator/(double) const;
  39. double operator*(const Vector&) const;
  40. Vector operator-() const;
  41. int operator==(const Vector&) const;
  42. int operator!=(const Vector& w) const { return !(*this == w); }
  43. private:
  44. double* v;
  45. int d;
  46. };
  47. inline double Vector::operator[](int i) const {
  48. if (i < 0 || i > d - 1) {
  49. cerr << "Vector: index out of range" << endl;
  50. exit(1);
  51. }
  52. return (v[i]);
  53. }
  54. inline double& Vector::operator[](int i) {
  55. if (i < 0 || i > d - 1) {
  56. cerr << "Vector: index out of range" << endl;
  57. exit(1);
  58. }
  59. return (v[i]);
  60. }
  61. inline Vector Vector::operator+(const Vector& vec) const {
  62. Vector result(d);
  63. int n = d;
  64. if (d != vec.d) {
  65. cerr << "Vector+: vectors have different length" << endl;
  66. exit(1);
  67. }
  68. while (n--) result.v[n] = v[n] + vec.v[n];
  69. return (result);
  70. }
  71. inline Vector Vector::operator-(const Vector& vec) const {
  72. Vector result(d);
  73. int n = d;
  74. if (d != vec.d) {
  75. cerr << "Vector-: vectors have different length" << endl;
  76. exit(1);
  77. }
  78. while (n--) result.v[n] = v[n] - vec.v[n];
  79. return (result);
  80. }
  81. inline Vector Vector::operator*(double x) const {
  82. Vector result(d);
  83. int n = d;
  84. while (n--) result.v[n] = v[n] * x;
  85. return (result);
  86. }
  87. inline Vector Vector::operator/(double x) const {
  88. Vector result(d);
  89. int n = d;
  90. while (n--) result.v[n] = v[n] / x;
  91. return (result);
  92. }
  93. inline Vector& Vector::operator+=(const Vector& vec) {
  94. int n = d;
  95. if (d != vec.d) {
  96. cerr << "Vector+=: vectors have different length" << endl;
  97. exit(1);
  98. }
  99. while (n--) v[n] += vec.v[n];
  100. return (*this);
  101. }
  102. inline Vector& Vector::operator-=(const Vector& vec) {
  103. int n = d;
  104. if (d != vec.d) {
  105. cerr << "Vector-=: vectors have different length" << endl;
  106. exit(1);
  107. }
  108. while (n--) v[n] -= vec.v[n];
  109. return (*this);
  110. }
  111. inline Vector& Vector::operator/=(double x) {
  112. int n = d;
  113. if (x == 0) {
  114. cerr << "Vector/=: divided by zero" << endl;
  115. exit(1);
  116. }
  117. while (n--) v[n] /= x;
  118. return (*this);
  119. }
  120. inline Vector& Vector::operator*=(double x) {
  121. int n = d;
  122. while (n--) v[n] *= x;
  123. return (*this);
  124. }
  125. inline Vector Vector::operator-() const {
  126. Vector result(d);
  127. int n = d;
  128. while (n--) result.v[n] = -v[n];
  129. return (result);
  130. }
  131. inline double Vector::operator*(const Vector& vec) const {
  132. if (d != vec.d) {
  133. cerr << "Vector*: vectors have different length" << endl;
  134. exit(1);
  135. }
  136. double result = 0;
  137. int n = d;
  138. while (n--) result = result + v[n] * vec.v[n];
  139. return (result);
  140. }
  141. inline Vector& Vector::operator=(const Vector& vec) {
  142. //if (this != &vec) {
  143. //int n = vec.d;
  144. //if (d != vec.d) {
  145. //cerr << "Vector=: vectors have different length" << endl;
  146. //exit(1);
  147. //}
  148. //while (n--) v[n] = vec.v[n];
  149. //}
  150. //return (*this);
  151. if (this != &vec) {
  152. int n = vec.d;
  153. if (n != d) {
  154. delete v;
  155. v = new double [n];
  156. d = n;
  157. }
  158. while (n--) v[n] = vec.v[n];
  159. }
  160. return (*this);
  161. }
  162. inline int Vector::operator==(const Vector& vec) const {
  163. if (vec.d != d) return (0);
  164. int i = 0;
  165. while ((i < d) && (v[i]==vec.v[i])) i++;
  166. return ((i == d) ? 1: 0);
  167. }
  168. inline Vector Vector::abs() const {
  169. Vector result(d);
  170. for(int i = 0; i < d; i++)
  171. result[i]=fabs(v[i]);
  172. return (result);
  173. }
  174. inline Vector& Vector::resize(int new_dim) {
  175. if(d != new_dim) {
  176. delete v;
  177. v = new double [new_dim];
  178. d = new_dim;
  179. }
  180. while (new_dim--) v[new_dim] = 0.0;
  181. return (*this);
  182. }
  183. inline void Vector::swap_elem(int m,int n) {
  184. double tmp = v[m];
  185. v[m] = v[n];
  186. v[n] = tmp;
  187. }
  188. inline void Print(const Vector& v, ostream& out=cout) { out << v; }
  189. inline void Read(Vector& v, istream& in=cin) { in >> v; }
  190. inline double max(double x,double y) { return (x > y ? x : y); }
  191. double norm(const Vector& v);
  192. double norm2(const Vector& v);
  193. Vector operator^(const Vector& v, const Vector& w);
  194. #endif