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