YAP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Vector.h
Go to the documentation of this file.
1 /* YAP - Yet another PWA toolkit
2  Copyright 2015, Technische Universitaet Muenchen,
3  Authors: Daniel Greenwald, Johannes Rauch
4 
5  This program is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
20 
21 #ifndef yap_Vector_h
22 #define yap_Vector_h
23 
24 #include "fwd/Vector.h"
25 
26 #include "Matrix.h"
27 
28 #include <algorithm>
29 #include <array>
30 #include <cmath>
31 #include <iterator>
32 #include <numeric>
33 #include <ostream>
34 #include <string>
35 #include <type_traits>
36 
37 namespace yap {
38 
43 template <typename T, size_t N>
44 class VectorIterator : public std::iterator<std::random_access_iterator_tag, T, typename std::array<T, N>::difference_type>
45 {
46 public:
47 
49  VectorIterator(typename std::array<T, N>::iterator it)
50  : Iterator_(it)
51  {}
52 
54  bool operator!=(VectorIterator b) const
55  { return this->Iterator_ != b.Iterator_; }
56 
58  T& operator*()
59  { return *(this->Iterator_); }
60 
63  { return std::array<T, N>::operator->(this->Iterator_); }
64 
67  { ++(this->Iterator_); return *this; }
68 
71  { VectorIterator it(*this); (this->Iterator_)++; return it; }
72 
75  { --(this->Iterator_); return *this; }
76 
79  { VectorIterator it(*this); --(this->Iterator_); return it; }
80 
82  VectorIterator& operator+=(typename VectorIterator::difference_type n)
83  { this->Iterator_ += n; return *this; }
84 
86  VectorIterator& operator-=(typename VectorIterator::difference_type n)
87  { this->Iterator_ -= n; return *this; }
88 
90  friend const typename VectorIterator::difference_type operator-(VectorIterator lhs, VectorIterator rhs)
91  { return lhs.Iterator_ - rhs.Iterator_; }
92 
94  VectorIterator operator[](typename VectorIterator::difference_type n) const
95  { VectorIterator it(Iterator_[n]); return it; }
96 
98  friend const bool operator<(VectorIterator lhs, VectorIterator rhs)
99  { return lhs.Iterator_ < rhs.Iterator_; }
100 
103  { return lhs.Iterator_ > rhs.Iterator_; }
104 
105 private:
106 
108  typename std::array<T, N>::iterator Iterator_;
109 };
110 
112 template <typename T, size_t N>
114 { return (VectorIterator<T, N>(a) += n); }
115 
117 template <typename T, size_t N>
119 { return a + n; }
120 
122 template <typename T, size_t N>
124 { return (VectorIterator<T, N>(a) -= n); }
125 
127 template <typename T, size_t N>
129 { return !(a < b); }
130 
132 template <typename T, size_t N>
133 bool operator<=(VectorIterator<T, N> a, VectorIterator<T, N> b)
134 { return !(b > a); }
135 
140 template <typename T, size_t N, typename E>
142 {
143 public:
144 
146  constexpr T operator[](size_t i) const
147  { return static_cast<const E&>(*this)[i]; }
148 
150  constexpr size_t size() const
151  { return N; }
152 
154  operator E& ()
155  { return static_cast<E&>(*this); }
156 
158  constexpr operator const E& () const
159  { return static_cast<const E&>(*this); }
160 
161 };
162 
167 template <typename T, size_t N>
168 class Vector : public VectorExpression<T, N, Vector<T, N> >
169 {
170 public:
172  constexpr Vector(const std::array<T, N>& v) noexcept : Elements_(v) {}
173 
175  template <typename E>
177  { for (size_t i = 0; i < V.size(); ++i) Elements_[i] = V[i]; }
178 
180  Vector(T element = 0)
181  { Elements_.fill(element); }
182 
184  T& operator[](size_t i)
185  { return Elements_[i]; }
186 
188  const T operator[](size_t i) const
189  { return Elements_[i]; }
190 
192  T& front()
193  { return Elements_.front(); }
194 
196  const T& front() const
197  { return Elements_.front(); }
198 
201  { return VectorIterator<T, N>(Elements_.begin()); }
202 
205  { return VectorIterator<const T, N>(Elements_.begin()); }
206 
209  { return VectorIterator<T, N>(Elements_.end()); }
210 
213  { return VectorIterator<const T, N>(Elements_.end()); }
214 
216  virtual auto operator*(const Vector<T, N>& B) const
217  -> decltype(T(0) * T(0))
218  { return std::inner_product(Elements_.begin(), Elements_.end(), B.Elements_.begin(), T(0) * T(0)); }
219 
221  friend bool operator==(const Vector<T, N>& lhs, const Vector<T, N>& rhs)
222  { return lhs.Elements_ == rhs.Elements_; }
223 
225  friend const T angle(const Vector<T, N>& A, const Vector<T, N>& B)
226  {
227  T arg = A * B / abs(A) / abs(B);
228 
229  // correct for arg just outside boundary (by numerical precision)
230  if (std::isfinite(arg) and fabs(arg) > 1)
231  arg = (arg > 0) ? (T)1 : (T) - 1;
232 
233  return acos(arg);
234  }
235 
237  friend constexpr T norm(const Vector<T, N>& A)
238  { return A * A; }
239 
240 
241 private:
242 
244  std::array<T, N> Elements_;
245 };
246 
251 template <typename T, size_t N, typename E1, typename E2>
252 class VectorAddition : public VectorExpression<T, N, VectorAddition<T, N, E1, E2> >
253 {
254 public:
257  : VectorExpression<T, N, VectorAddition<T, N, E1, E2> >(), A_(a), B_(b)
258  {}
259 
261  constexpr T operator[](size_t i) const
262  { return A_[i] + B_[i]; }
263 
264 private:
265 
267  const E1& A_;
268 
270  const E2& B_;
271 
272 };
273 
275 template <typename T, size_t N, typename E1, typename E2>
277 { return VectorAddition<T, N, E1, E2>(a, b); }
278 
283 template <typename T, size_t N, typename E1, typename E2>
284 class VectorSubtraction : public VectorExpression<T, N, VectorSubtraction<T, N, E1, E2> >
285 {
286 public:
289  : VectorExpression<T, N, VectorSubtraction<T, N, E1, E2> >(), A_(a), B_(b)
290  {}
291 
293  constexpr T operator[](size_t i) const
294  { return A_[i] - B_[i]; }
295 
296 private:
297 
299  const E1& A_;
300 
302  const E2& B_;
303 
304 };
305 
307 template <typename T, size_t N, typename E1, typename E2>
309 { return VectorSubtraction<T, N, E1, E2>(a, b); }
310 
312 template <typename T, size_t N>
313 std::string to_string(const Vector<T, N>& V)
314 {
315  if (N == 0)
316  return "(empty)";
317  std::string s = "(";
318  std::for_each(V.begin(), V.end(), [&](const T & t) {s += std::to_string(t) + ", ";});
319  s.erase(s.size() - 2, 2);
320  s += ")";
321  return s;
322 }
323 
325 template <typename T, size_t N>
326 std::ostream& operator<<(std::ostream& os, const Vector<T, N>& V)
327 { os << to_string(V); return os; }
328 
330 template <typename T, size_t N>
332 { std::transform(A.begin(), A.end(), B.begin(), A.begin(), [](const T & a, const T & b) {return a + b;}); return A; }
333 
335 template <typename T, size_t N>
337 { return T(-1) * V; }
338 
340 template <typename T, size_t N>
342 { std::transform(A.begin(), A.end(), B.begin(), A.begin(), [](const T & a, const T & b) {return a - b;}); return A; }
343 
345 template <typename T, size_t N>
347 { std::transform(A.begin(), A.end(), A.begin(), [&](const T & v) {return B * v;}); return A; }
348 
350 template <typename T, size_t N>
351 const Vector<T, N> operator*(const Vector<T, N>& A, const T& c)
352 { auto v = A; return v *= c; return v; }
353 
355 template <typename T, size_t N>
356 constexpr Vector<T, N> operator*(const T& c, const Vector<T, N>& A)
357 { return A * c; }
358 
360 template <typename T, size_t N>
362 { std::transform(A.begin(), A.end(), A.begin(), [&](const T & v) {return v / B;}); return A; }
363 
365 template <typename T, size_t N>
366 const Vector<T, N> operator/(const Vector<T, N>& A, const T& c)
367 { auto v = A; v /= c; return v; }
368 
370 template <typename T, size_t N>
371 constexpr T abs(const Vector<T, N>& A)
372 { return sqrt(norm(A)); }
373 
376 template <typename T, size_t N>
378 { T a = abs(V); return (a == 0) ? V : (T(1) / a) * V; }
379 
381 template <typename T, size_t R, size_t C>
383 {
384  Vector<T, R> v;
385  for (size_t r = 0; r < R; ++r)
386  for (size_t c = 0; c < C; ++c)
387  v[r] += M[r][c] * V[c];
388  return v;
389 }
390 
392 template <typename T1, typename T2, size_t R, size_t C>
393 auto operator*(const Matrix<T1, R, C>& M, const Vector<T2, C>& V)
395 {
397  for (size_t r = 0; r < R; ++r)
398  for (size_t c = 0; c < C; ++c)
399  v[r] += M[r][c] * V[c];
400  return v;
401 }
402 
404 template <typename T, size_t N>
405 const SquareMatrix<T, N> outer(const Vector<T, N>& A, const Vector<T, N>& B)
406 {
407  SquareMatrix<T, N> m;
408  for (size_t r = 0; r < N; ++r)
409  for (size_t c = 0; c < N; ++c)
410  m[r][c] = A[r] * B[c];
411  return m;
412 }
413 
414 }
415 #endif
friend const T angle(const Vector< T, N > &A, const Vector< T, N > &B)
Calculate the angle between two vectors.
Definition: Vector.h:225
friend const VectorIterator::difference_type operator-(VectorIterator lhs, VectorIterator rhs)
difference operator
Definition: Vector.h:90
std::string to_string(const Vector< T, N > &V)
Definition: Vector.h:313
Matrix< T, R, C > & operator+=(Matrix< T, R, C > &lhs, const Matrix< T, R, C > &rhs)
addition assignment
Definition: Matrix.h:240
friend constexpr T norm(const Vector< T, N > &A)
Definition: Vector.h:237
constexpr VectorSubtraction(const VectorExpression< T, N, E1 > &a, const VectorExpression< T, N, E2 > &b)
Constructor.
Definition: Vector.h:288
const IntegralElement< T > operator/(IntegralElement< T > A, const IntegralElement< T > &B)
Definition: IntegralElement.h:128
VectorIterator< const T, N > begin() const
access to begin
Definition: Vector.h:204
VectorIterator & operator--()
pre-decrement operator
Definition: Vector.h:74
constexpr size_t size() const
Definition: Vector.h:150
VectorIterator operator++(int)
post-increment operator
Definition: Vector.h:70
VectorIterator & operator-=(typename VectorIterator::difference_type n)
subtraction assignment operator
Definition: Vector.h:86
friend const bool operator<(VectorIterator lhs, VectorIterator rhs)
less-than operator
Definition: Vector.h:98
constexpr T operator[](size_t i) const
access operator
Definition: Vector.h:293
T & operator*()
dereference operator
Definition: Vector.h:58
constexpr T operator[](size_t i) const
access operator
Definition: Vector.h:261
constexpr T abs(const Vector< T, N > &A)
Definition: Vector.h:371
constexpr VectorAddition(const VectorExpression< T, N, E1 > &a, const VectorExpression< T, N, E2 > &b)
Constructor.
Definition: Vector.h:256
const E1 & A_
lhs expression
Definition: Vector.h:299
const SquareMatrix< T, N > outer(const Vector< T, N > &A, const Vector< T, N > &B)
outer product
Definition: Vector.h:405
T & operator[](size_t i)
element access operator
Definition: Vector.h:184
const E1 & A_
lhs expression
Definition: Vector.h:267
VectorIterator & operator++()
pre-increment operator
Definition: Vector.h:66
const DataIterator operator-(const DataIterator &lhs, DataIterator::difference_type n)
subraction operator
Definition: DataPartition.h:139
const E2 & B_
rhs expression
Definition: Vector.h:302
VectorIterator< const T, N > end() const
access to end
Definition: Vector.h:212
VectorIterator< T, N > end()
access to end
Definition: Vector.h:208
const bool operator>=(const DataIterator &lhs, const DataIterator &rhs)
greater-than-or-equal operator
Definition: DataPartition.h:147
Iterator for Vector class.
Definition: Vector.h:44
constexpr T operator[](size_t i) const
access operator
Definition: Vector.h:146
const E2 & B_
rhs expression
Definition: Vector.h:270
virtual auto operator*(const Vector< T, N > &B) const -> decltype(T(0)*T(0))
inner (dot) product of Vector's
Definition: Vector.h:216
Class for holding vector expressions.
Definition: Vector.h:141
friend bool operator>(VectorIterator lhs, VectorIterator rhs)
greater-than operator
Definition: Vector.h:102
VectorIterator operator--(int)
post-decrement operator
Definition: Vector.h:78
VectorIterator(typename std::array< T, N >::iterator it)
Constructor.
Definition: Vector.h:49
const CoordinateSystem< T, N > operator*(const SquareMatrix< T, N > &M, const CoordinateSystem< T, N > &C)
Definition: CoordinateSystem.h:62
VectorIterator operator[](typename VectorIterator::difference_type n) const
access operator
Definition: Vector.h:94
friend bool operator==(const Vector< T, N > &lhs, const Vector< T, N > &rhs)
equality operator
Definition: Vector.h:221
const CoordinateSystem< T, N > unit(const CoordinateSystem< T, N > &C)
Definition: CoordinateSystem.h:52
Matrix< T, R, C > & operator-=(Matrix< T, R, C > &lhs, const Matrix< T, R, C > &rhs)
subtraction assignment
Definition: Matrix.h:255
Expression for subtraction of two VectorExpressions.
Definition: Vector.h:284
Expression for addition of two VectorExpressions.
Definition: Vector.h:252
Matrix< T, R, C > & operator*=(Matrix< T, R, C > &M, const T &c)
assignment by multiplication by a single element
Definition: Matrix.h:205
Vector(T element=0)
Default constructor.
Definition: Vector.h:180
constexpr Vector(const std::array< T, N > &v) noexcept
Constructor.
Definition: Vector.h:172
bool operator!=(VectorIterator b) const
inequality operator
Definition: Vector.h:54
std::string to_string(const CachedValue::Status &S)
streaming operator for CachedValue::Status
Definition: CachedValue.cxx:27
const DataIterator operator+(DataIterator lhs, DataIterator::difference_type n)
addition operator
Definition: DataPartition.h:131
Vector(const VectorExpression< T, N, E > &V)
expression constructor
Definition: Vector.h:176
std::array< T, N > Elements_
internal storage
Definition: Vector.h:244
T & front()
access to front
Definition: Vector.h:192
Definition: Matrix.h:41
const T operator[](size_t i) const
element access operator
Definition: Vector.h:188
T * operator->()
pointer operator
Definition: Vector.h:62
std::array< T, N >::iterator Iterator_
internal iterator
Definition: Vector.h:108
Vector< T, N > & operator/=(Vector< T, N > &A, const T &B)
(assignment) division by a single element
Definition: Vector.h:361
VectorIterator< T, N > begin()
access to begin
Definition: Vector.h:200
const T & front() const
access to front
Definition: Vector.h:196
VectorIterator & operator+=(typename VectorIterator::difference_type n)
addition assignment operator
Definition: Vector.h:82
N-dimensional column vector.
Definition: Vector.h:168