My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
Vector.h
Go to the documentation of this file.
1 #ifndef GCP_UTIL_VECTOR_H
2 #define GCP_UTIL_VECTOR_H
3 
11 #include "gcp/util/common/Exception.h"
12 #include "gcp/util/common/LogStream.h"
13 
14 #include <cmath>
15 #include <iostream>
16 #include <iomanip>
17 #include <sstream>
18 #include <vector>
19 
20 namespace gcp {
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 
91  const Vector<type> operator+(const Vector<type>& vec);
92 
96  const Vector<type> operator-(const Vector<type>& vec);
97 
101  const Vector<type> operator*(const type factor);
102 
106  const Vector<type> operator/(const type factor);
107 
111  const Vector<type> operator+(const type offset);
112 
116  const Vector<type> operator-(const type offset);
117 
118  void add(Vector<type> vec);
119  void push_back(type el);
120 
121  //------------------------------------------------------------
122  // Non-member friends
123  //------------------------------------------------------------
124 
128  friend std::ostream& gcp::util::operator << <>
129  (std::ostream& os, const Vector<type>& vec);
130 
134  friend std::ostringstream& gcp::util::operator << <>
135  (std::ostringstream& os, const Vector<type>& vec);
136 
140  Vector();
141 
145  inline void resize(unsigned n) {
146  data_.resize(n);
147  }
148 
149  protected:
150 
151  // Privately, Vector is implemented as a std::vector
152 
153  std::vector<type> data_;
154 
158  friend class Matrix<type>;
159 
160 
161  }; // End class Vector
162 
166  template<class type>
168 
172  template<class type>
173  Vector<type>::Vector(type el0, type el1, type el2)
174  {
175  data_.resize(3);
176 
177  data_[0] = el0;
178  data_[1] = el1;
179  data_[2] = el2;
180  }
181 
185  template<class type>
186  Vector<type>::Vector(unsigned n)
187  {
188  data_.resize(n);
189  }
190 
194  template<class type>
196  {
197  data_.resize(vec.data_.size());
198  for(unsigned i=0; i < vec.data_.size(); i++)
199  data_[i] = vec.data_[i];
200  }
201 
221  template<class type>
223 
227  template <class type>
229  {
230  double sum=0.0;
231 
232  for(unsigned iel=0; iel < data_.size(); iel++)
233  sum += data_[iel]*data_[iel];
234 
235  return sqrt(sum);
236  }
237 
241  template<class type>
242  type& Vector<type>::operator[](unsigned i)
243  {
244  LogStream errStr;
245 
246  if(i > data_.size()-1) {
247  errStr.initMessage(true);
248  errStr << "Vector has no element: " << i;
249  errStr.report();
250  throw Error(errStr);
251  }
252 
253  return data_[i];
254  }
255 
259  template<class type>
260  const type Vector<type>::operator*(const Vector<type>& vec)
261  {
262  LogStream errStr;
263 
264  if(data_.size()==0 || vec.data_.size()==0) {
265  errStr.appendMessage(true, "Received vector size of zero");
266  errStr.report();
267  throw Error(errStr);
268  }
269 
270  if(data_.size() != vec.data_.size()) {
271  errStr.appendMessage(true, "Vectors must have the same size");
272  errStr.report();
273  throw Error(errStr);
274  }
275 
276  bool first=true;
277  type sum;
278  for(unsigned i=0; i < data_.size(); i++) {
279  if(first) {
280  sum = data_[i] * vec.data_[i];
281  first = false;
282  } else {
283  sum += data_[i] * vec.data_[i];
284  }
285  }
286  return sum;
287  }
288 
289  template<class type>
290  void Vector<type>::push_back(type el)
291  {
292  data_.push_back(el);
293  }
294 
295  template<class type>
296  void Vector<type>::add(Vector<type> vec)
297  {
298  data_.insert(data_.end(), vec.data_.begin(), vec.data_.end());
299  }
300 
304  template<class type>
305  const Vector<type>
307  {
308  LogStream errStr;
309 
310  if(data_.size()==0 || vec.data_.size()==0) {
311  errStr.appendMessage(true, "Received vector size of zero");
312  errStr.report();
313  throw Error(errStr);
314  }
315 
316  if(data_.size() != vec.data_.size()) {
317  errStr.appendMessage(true, "Vectors must have the same size");
318  errStr.report();
319  throw Error(errStr);
320  }
321 
322  Vector<type> result(data_.size());
323 
324  for(unsigned i=0; i < data_.size(); i++)
325  result.data_[i] = (data_[i] + vec.data_[i]);
326 
327  return result;
328  }
329 
333  template<class type>
334  const Vector<type>
336  {
337  LogStream errStr;
338 
339  if(data_.size()==0 || vec.data_.size()==0) {
340  errStr.appendMessage(true, "Received vector size of zero");
341  errStr.report();
342  throw Error(errStr);
343  }
344 
345  if(data_.size() != vec.data_.size()) {
346  errStr.appendMessage(true, "Vectors must have the same size");
347  errStr.report();
348  throw Error(errStr);
349  }
350 
351  Vector<type> result(data_.size());
352 
353  for(unsigned i=0; i < data_.size(); i++)
354  result.data_[i] = (data_[i] - vec.data_[i]);
355 
356  return result;
357  }
358 
362  template<class type>
363  const Vector<type>
364  Vector<type>::operator*(const type factor)
365  {
366  LogStream errStr;
367 
368  if(data_.size()==0) {
369  errStr.appendMessage(true, "Received vector size of zero");
370  errStr.report();
371  throw Error(errStr);
372  }
373 
374  Vector<type> result(data_.size());
375 
376  for(unsigned i=0; i < data_.size(); i++)
377  result.data_[i] = (data_[i] * factor);
378 
379  return result;
380  }
381 
385  template<class type>
386  const Vector<type>
387  Vector<type>::operator/(const type factor)
388  {
389  LogStream errStr;
390 
391  if(data_.size()==0) {
392  errStr.appendMessage(true, "Vector has size of zero");
393  errStr.report();
394  throw Error(errStr);
395  }
396 
397  Vector<type> result(data_.size());
398 
399  for(unsigned i=0; i < data_.size(); i++)
400  result.data_[i] = (data_[i] / factor);
401 
402  return result;
403  }
404 
408  template<class type>
409  const Vector<type>
410  Vector<type>::operator+(const type offset)
411  {
412  LogStream errStr;
413 
414  if(data_.size()==0) {
415  errStr.appendMessage(true, "Received vector size of zero");
416  errStr.report();
417  throw Error(errStr);
418  }
419 
420  Vector<type> result(data_.size());
421 
422  for(unsigned i=0; i < data_.size(); i++)
423  result.data_[i] = (data_[i] + offset);
424 
425  return result;
426  }
427 
431  template<class type>
432  const Vector<type>
433  Vector<type>::operator-(const type offset)
434  {
435  LogStream errStr;
436 
437  if(data_.size()==0) {
438  errStr.appendMessage(true, "Vector has size of zero");
439  errStr.report();
440  throw Error(errStr);
441  }
442 
443  Vector<type> result(data_.size());
444 
445  for(unsigned i=0; i < data_.size(); i++)
446  result.data_[i] = (data_[i] - offset);
447 
448  return result;
449  }
450 
454  template <class type>
455  std::ostream& operator<<(std::ostream& os,
456  const Vector<type>& vec)
457  {
458  os << "(";
459  for(unsigned i=0; i < vec.data_.size(); i++) {
460  if(i != 0)
461  os << ", ";
462  os << std::setw(18) << std::setprecision(12) << vec.data_[i];
463  }
464  os << ")" << std::ends;
465 
466  return os;
467  }
468 
472  template <class type>
473  std::ostringstream& operator<<(std::ostringstream& os,
474  const Vector<type>& vec)
475  {
476  os << "(";
477  for(unsigned i=0; i < vec.data_.size(); i++) {
478  if(i != 0)
479  os << ", ";
480  os << std::setw(18) << std::setprecision(12) << vec.data_[i];
481  }
482  os << ")" << std::ends;
483 
484  return os;
485  }
486 
487  } // End namespace util
488 } // End namespace gcp
489 
490 
491 #endif // End #ifndef GCP_UTIL_VECTOR_H
void report()
Definition: LogStream.cc:194
const Vector< type > operator/(const type factor)
Definition: Vector.h:387
type & operator[](unsigned i)
Definition: Vector.h:242
void resize(unsigned n)
Definition: Vector.h:145
unsigned size()
Definition: Vector.h:64
const Vector< type > operator-(const Vector< type > &vec)
Definition: Vector.h:335
Vector()
Definition: Vector.h:167
Definition: LogStream.h:21
double magnitude()
Definition: Vector.h:228
Definition: Vector.h:27
Definition: Matrix.h:27
virtual ~Vector()
Definition: Vector.h:222
const type operator*(const Vector< type > &vec)
Definition: Vector.h:260
const Vector< type > operator+(const Vector< type > &vec)
Definition: Vector.h:306