1 #ifndef _vector_h
2 #define _vector_h
3
4 #ifndef _real_h
5 # include "real.h"
6 #endif
7
8 //
9 // -------------------------------------------------------------------------
10 // class Vector : Vektorklasse f�r beliebig dimensionierte Vektoren
11 // -------------------------------------------------------------------------
12 //
13
14 class Vec2;
15 class Vec3;
16
17 class Vector {
18 protected:
19 short dim;
20 Real *data;
21 static Real ErrorZero;
22
23 public:
Vector()24 Vector() { dim=0; }
25 Vector( int n, double d0, ... );
26 Vector( const Vector &v );
27 #if (Vec2IsVector==0)
28 Vector( const Vec2 &v );
29 #endif
30 #if (Vec3IsVector==0)
31 Vector( const Vec3 &v );
32 #endif
~Vector()33 ~Vector() { if (dim) delete [] data; }
34
35 void show(const char *str=0) const;
36
37 protected:
38 void Resize(int i);
39 Real &GetRef(int i);
40 public:
operator()41 const Real &operator()(int i) const
42 { return (i>=0&&i<dim)?data[i]:ErrorZero; }
43 Real &operator[](int i)
44 { return (i>=0&&i<dim)?data[i]:GetRef(i); }
45
46 int IsZero() const;
47
48 Real SqrNorm() const;
49 Real Norm() const;
50 Vector Norm1() const;
51
52
53 const Vector& operator=(const Vector &v); // Copy
54 const Vector& operator<<=(Vector &v); // Move
55
56 inline Vector operator+(const Vector&) const;
57 inline Vector operator-(const Vector&) const;
58
59 friend Real operator*(const Vector&, const Vector&);
60 inline Vector operator*(const Real&) const;
61 friend inline Vector operator*(const Real&, const Vector&);
62 inline Vector operator/(const Real&) const;
63
64 friend int operator==(const Vector&, const Vector&);
65 friend inline int operator!=(const Vector&, const Vector&);
66 const Vector& operator+=(const Vector&);
67 const Vector& operator-=(const Vector&);
68 const Vector& operator*=(const Real&);
69 const Vector& operator/=(const Real&);
70 inline Vector operator+() const;
71 inline Vector operator-() const;
72
73
74 friend class Matrix;
75 friend Vector operator*(const class Matrix& m, const Vector& v);
76 friend Vector operator*(const Vector& v, const class Matrix& m);
77 friend int system_calc(class Matrix &a, Vector *x, Vector &b);
78 };
79
80 inline Vector Vector::operator+() const
81 {
82 return *this;
83 }
84 inline Vector Vector::operator-() const
85 {
86 Vector v(*this);
87 return v*=Real(-1.0);
88 }
89
90
91 // Definitions of non-member binary operator functions
92
93 inline Vector Vector::operator+(const Vector& z2) const
94 {
95 if (dim>z2.dim) {
96 Vector v(*this);
97 return v+=z2;
98 }
99 else {
100 Vector v(z2);
101 return v+=*this;
102 }
103 }
104 inline Vector Vector::operator-(const Vector& z2) const
105 {
106 Vector v(*this);
107 return v-=z2;
108 }
109
110 inline Vector Vector::operator*(const Real& r) const
111 {
112 Vector erg(*this);
113 erg *= r;
114 return erg;
115 }
116
117 inline Vector Vector::operator/(const Real& r) const
118 {
119 Vector erg(*this);
120 erg /= r;
121 return erg;
122 }
123
124
125 inline Vector operator*(const Real& val, const Vector& z2)
126 {
127 return z2*val; // kommutativ
128 }
129
130 inline int operator!=(const Vector& z1, const Vector& z2)
131 {
132 return !(z1==z2);
133 }
134
Norm()135 inline Real Vector::Norm() const { return sqrt(SqrNorm()); }
Norm1()136 inline Vector Vector::Norm1() const { return *this / Norm(); }
137
138 extern Vector VectorZero;
139
140 #endif
141