1 #ifndef FILE_VECTOR
2 #define FILE_VECTOR
3
4 /* *************************************************************************/
5 /* File: vector.hpp */
6 /* Author: Joachim Schoeberl */
7 /* Date: 01. Oct. 94 */
8 /* *************************************************************************/
9
10
11 class FlatVector
12 {
13 protected:
14 int s;
15 double *data;
16 public:
FlatVector()17 FlatVector () { ; }
FlatVector(int as,double * adata)18 FlatVector (int as, double * adata)
19 { s = as; data = adata; }
20
Size() const21 int Size () const
22 { return s; }
23
operator =(const FlatVector & v)24 FlatVector & operator= (const FlatVector & v)
25 { memcpy (data, v.data, s*sizeof(double)); return *this; }
26
operator =(double scal)27 FlatVector & operator= (double scal)
28 {
29 for (int i = 0; i < s; i++) data[i] = scal;
30 return *this;
31 }
32
operator [](int i)33 double & operator[] (int i) { return data[i]; }
operator [](int i) const34 const double & operator[] (int i) const { return data[i]; }
operator ()(int i)35 double & operator() (int i) { return data[i]; }
operator ()(int i) const36 const double & operator() (int i) const { return data[i]; }
37
38 // double & Elem (int i) { return data[i-1]; }
39 // const double & Get (int i) const { return data[i-1]; }
40 // void Set (int i, double val) { data[i-1] = val; }
41
operator *=(double scal)42 FlatVector & operator*= (double scal)
43 {
44 for (int i = 0; i < s; i++) data[i] *= scal;
45 return *this;
46 }
47
Add(double scal,const FlatVector & v2)48 FlatVector & Add (double scal, const FlatVector & v2)
49 {
50 for (int i = 0; i < s; i++)
51 data[i] += scal * v2[i];
52 return *this;
53 }
54
Set(double scal,const FlatVector & v2)55 FlatVector & Set (double scal, const FlatVector & v2)
56 {
57 for (int i = 0; i < s; i++)
58 data[i] = scal * v2[i];
59 return *this;
60 }
61
Set2(double scal1,const FlatVector & v1,double scal2,const FlatVector & v2)62 FlatVector & Set2 (double scal1, const FlatVector & v1,
63 double scal2, const FlatVector & v2)
64 {
65 for (int i = 0; i < s; i++)
66 data[i] = scal1 * v1[i] + scal2 * v2[i];
67 return *this;
68 }
69
L2Norm() const70 double L2Norm() const
71 {
72 double sum = 0;
73 for (int i = 0; i < s; i++)
74 sum += data[i] * data[i];
75 return sqrt (sum);
76 }
77
78 friend double operator* (const FlatVector & v1, const FlatVector & v2);
79 };
80
81
82
83 class Vector : public FlatVector
84 {
85 bool ownmem;
86 public:
Vector()87 Vector ()
88 { s = 0; data = 0; ownmem = false; }
Vector(int as)89 Vector (int as)
90 { s = as; data = new double[s]; ownmem = true; }
Vector(int as,double * mem)91 Vector (int as, double * mem)
92 { s = as; data = mem; ownmem = false; }
~Vector()93 ~Vector ()
94 { if (ownmem) delete [] data; }
95
operator =(const FlatVector & v)96 Vector & operator= (const FlatVector & v)
97 { memcpy (data, &v(0), s*sizeof(double)); return *this; }
98
operator =(double scal)99 Vector & operator= (double scal)
100 {
101 for (int i = 0; i < s; i++) data[i] = scal;
102 return *this;
103 }
104
SetSize(int as)105 void SetSize (int as)
106 {
107 if (s != as)
108 {
109 s = as;
110 if (ownmem) delete [] data;
111 data = new double [s];
112 ownmem = true;
113 }
114 }
115
116 };
117
118 template <int S>
119 class VectorMem : public Vector
120 {
121 double mem[S];
122 public:
VectorMem()123 VectorMem () : Vector(S, &mem[0]) { ; }
124
operator =(const FlatVector & v)125 VectorMem & operator= (const FlatVector & v)
126 { memcpy (data, &v(0), S*sizeof(double)); return *this; }
127
operator =(double scal)128 VectorMem & operator= (double scal)
129 {
130 for (int i = 0; i < S; i++) data[i] = scal;
131 return *this;
132 }
133 };
134
135
136
137
138
operator *(const FlatVector & v1,const FlatVector & v2)139 inline double operator* (const FlatVector & v1, const FlatVector & v2)
140 {
141 double sum = 0;
142 for (int i = 0; i < v1.s; i++)
143 sum += v1.data[i] * v2.data[i];
144 return sum;
145 }
146
147
148
149
operator <<(ostream & ost,const FlatVector & v)150 inline ostream & operator<< (ostream & ost, const FlatVector & v)
151 {
152 for (int i = 0; i < v.Size(); i++)
153 ost << " " << setw(7) << v[i];
154 return ost;
155 }
156
157
158
159 #endif
160
161
162