CARMA C++
Vector.h
1 #ifndef SZA_UTIL_VECTOR_H
2 #define SZA_UTIL_VECTOR_H
3 
13 
14 #include <cmath>
15 #include <iostream>
16 #include <iomanip>
17 #include <sstream>
18 #include <vector>
19 
20 namespace sza {
21  namespace util {
22 
23  template <class type>
24  class Matrix;
25 
26  template <class type>
27  class Vector;
28 
29  template <class type>
30  std::ostream& operator<<(std::ostream& os,
31  const Vector<type>& vec);
32  template <class type>
33  std::ostringstream& operator<<(std::ostringstream& os,
34  const Vector<type>& vec);
35 
36  template<class type>
37  class Vector {
38 
39  public:
40 
44  Vector(unsigned n);
45 
49  Vector(type el0, type el1, type el2);
50 
54  Vector(const Vector<type>& vec);
55 
59  virtual ~Vector();
60 
64  inline unsigned size() {
65  return data_.size();
66  }
67 
71  double magnitude();
72 
76  type& operator[](unsigned i);
77 
86  const type operator*(const Vector<type>& vec);
87  const Vector<double> operator*(double factor);
88 
92  const Vector<type> operator+(const Vector<type>& vec);
93 
97  const Vector<type> operator-(const Vector<type>& vec);
98 
102  const Vector<double> operator/(const type factor);
103 
107  const Vector<type> operator+(const type offset);
108 
112  const Vector<type> operator-(const type offset);
113 
114  void add(Vector<type> vec);
115  void push_back(type el);
116 
117  //------------------------------------------------------------
118  // Non-member friends
119  //------------------------------------------------------------
120 
124  friend std::ostream& operator << <>
125  (std::ostream& os, const Vector<type>& vec);
126 
130  friend std::ostringstream& operator << <>
131  (std::ostringstream& os, const Vector<type>& vec);
132 
136  Vector();
137 
141  inline void resize(unsigned n) {
142  data_.resize(n);
143  }
144 
145  protected:
146 
147  // Privately, Vector is implemented as a std::vector
148 
149  std::vector<type> data_;
150 
154  friend class Matrix<type>;
155 
156 
157  }; // End class Vector
158 
162  template<class type>
163  Vector<type>::Vector() {}
164 
168  template<class type>
169  Vector<type>::Vector(type el0, type el1, type el2)
170  {
171  data_.resize(3);
172 
173  data_[0] = el0;
174  data_[1] = el1;
175  data_[2] = el2;
176  }
177 
181  template<class type>
182  Vector<type>::Vector(unsigned n)
183  {
184  data_.resize(n);
185  }
186 
190  template<class type>
191  Vector<type>::Vector(const Vector<type>& vec)
192  {
193  data_.resize(vec.data_.size());
194  for(unsigned i=0; i < vec.data_.size(); i++)
195  data_[i] = vec.data_[i];
196  }
197 
217  template<class type>
218  Vector<type>::~Vector() {}
219 
223  template <class type>
224  double Vector<type>::magnitude()
225  {
226  double sum=0.0;
227 
228  for(unsigned iel=0; iel < data_.size(); iel++)
229  sum += data_[iel]*data_[iel];
230 
231  return sqrt(sum);
232  }
233 
237  template<class type>
238  type& Vector<type>::operator[](unsigned i)
239  {
240  LogStream errStr;
241 
242  if(i > data_.size()-1) {
243  errStr.initMessage(true);
244  errStr << "Vector has no element: " << i;
245  errStr.report();
246  throw Error(errStr);
247  }
248 
249  return data_[i];
250  }
251 
255  template<class type>
256  const type Vector<type>::operator*(const Vector<type>& vec)
257  {
258  if(data_.size()==0 || vec.data_.size()==0) {
259  ThrowError("Received vector size of zero");
260  }
261 
262  if(data_.size() != vec.data_.size()) {
263  ThrowError("Vectors must have the same size");
264  }
265 
266  bool first=true;
267  type sum;
268  for(unsigned i=0; i < data_.size(); i++) {
269  if(first) {
270  sum = data_[i] * vec.data_[i];
271  first = false;
272  } else {
273  sum += data_[i] * vec.data_[i];
274  }
275  }
276  return sum;
277  }
278 
279  template<class type>
280  void Vector<type>::push_back(type el)
281  {
282  data_.push_back(el);
283  }
284 
285  template<class type>
286  void Vector<type>::add(Vector<type> vec)
287  {
288  data_.resize(data_.size() + vec.size());
289  data_.insert(data_.end(), vec.data_.begin(), vec.data_.end());
290  }
291 
295  template<class type>
296  const Vector<type>
297  Vector<type>::operator+(const Vector<type>& vec)
298  {
299  LogStream errStr;
300 
301  if(data_.size()==0 || vec.data_.size()==0) {
302  errStr.appendMessage(true, "Received vector size of zero");
303  errStr.report();
304  throw Error(errStr);
305  }
306 
307  if(data_.size() != vec.data_.size()) {
308  errStr.appendMessage(true, "Vectors must have the same size");
309  errStr.report();
310  throw Error(errStr);
311  }
312 
313  Vector<type> result(data_.size());
314 
315  for(unsigned i=0; i < data_.size(); i++)
316  result.data_[i] = (data_[i] + vec.data_[i]);
317 
318  return result;
319  }
320 
324  template<class type>
325  const Vector<type>
326  Vector<type>::operator-(const Vector<type>& vec)
327  {
328  LogStream errStr;
329 
330  if(data_.size()==0 || vec.data_.size()==0) {
331  errStr.appendMessage(true, "Received vector size of zero");
332  errStr.report();
333  throw Error(errStr);
334  }
335 
336  if(data_.size() != vec.data_.size()) {
337  errStr.appendMessage(true, "Vectors must have the same size");
338  errStr.report();
339  throw Error(errStr);
340  }
341 
342  Vector<type> result(data_.size());
343 
344  for(unsigned i=0; i < data_.size(); i++)
345  result.data_[i] = (data_[i] - vec.data_[i]);
346 
347  return result;
348  }
349 
353  template<class type>
354  const Vector<double>
355  Vector<type>::operator/(const type factor)
356  {
357  if(data_.size()==0) {
358  ThrowError("Vector has size zero");
359  }
360 
361  Vector<double> result(data_.size());
362 
363  for(unsigned i=0; i < data_.size(); i++)
364  result[i] = (data_[i] / factor);
365 
366  return result;
367  }
368 
372  template<class type>
373  const Vector<double>
374  Vector<type>::operator*(double factor)
375  {
376  if(data_.size()==0) {
377  ThrowError("Vector has size zero");
378  }
379 
380  Vector<double> result(data_.size());
381 
382  for(unsigned i=0; i < data_.size(); i++)
383  result[i] = (data_[i] * factor);
384 
385  return result;
386  }
387 
391  template<class type>
392  const Vector<type>
393  Vector<type>::operator+(const type offset)
394  {
395  LogStream errStr;
396 
397  if(data_.size()==0) {
398  errStr.appendMessage(true, "Received vector size of zero");
399  errStr.report();
400  throw Error(errStr);
401  }
402 
403  Vector<type> result(data_.size());
404 
405  for(unsigned i=0; i < data_.size(); i++)
406  result.data_[i] = (data_[i] + offset);
407 
408  return result;
409  }
410 
414  template<class type>
415  const Vector<type>
416  Vector<type>::operator-(const type offset)
417  {
418  LogStream errStr;
419 
420  if(data_.size()==0) {
421  errStr.appendMessage(true, "Vector has size of zero");
422  errStr.report();
423  throw Error(errStr);
424  }
425 
426  Vector<type> result(data_.size());
427 
428  for(unsigned i=0; i < data_.size(); i++)
429  result.data_[i] = (data_[i] - offset);
430 
431  return result;
432  }
433 
437  template <class type>
438  std::ostream& operator<<(std::ostream& os,
439  const Vector<type>& vec)
440  {
441  os << "(";
442  for(unsigned i=0; i < vec.data_.size(); i++) {
443  if(i != 0)
444  os << ", ";
445  os << std::setw(18) << std::setprecision(12) << vec.data_[i];
446  }
447  os << ")" << std::ends;
448 
449  return os;
450  }
451 
455  template <class type>
456  std::ostringstream& operator<<(std::ostringstream& os,
457  const Vector<type>& vec)
458  {
459  os << "(";
460  for(unsigned i=0; i < vec.data_.size(); i++) {
461  if(i != 0)
462  os << ", ";
463  os << std::setw(18) << std::setprecision(12) << vec.data_[i];
464  }
465  os << ")" << std::ends;
466 
467  return os;
468  }
469 
470  } // End namespace util
471 } // End namespace sza
472 
473 #endif // End #ifndef SZA_UTIL_VECTOR_H
Started: Sun Dec 14 07:19:50 UTC 2003.
Tagged: Fri Nov 14 12:39:33 UTC 2003.