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