24 #include "fwd/Vector.h"
35 #include <type_traits>
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>
63 {
return std::array<T, N>::operator->(this->
Iterator_); }
112 template <
typename T,
size_t N>
117 template <
typename T,
size_t N>
122 template <
typename T,
size_t N>
127 template <
typename T,
size_t N>
132 template <
typename T,
size_t N>
140 template <
typename T,
size_t N,
typename E>
147 {
return static_cast<const E&
>(*this)[i]; }
155 {
return static_cast<E&
>(*this); }
158 constexpr
operator const E& ()
const
159 {
return static_cast<const E&
>(*this); }
167 template <
typename T,
size_t N>
175 template <
typename E>
177 {
for (
size_t i = 0; i < V.
size(); ++i)
Elements_[i] = V[i]; }
217 -> decltype(T(0) * T(0))
218 {
return std::inner_product(
Elements_.begin(),
Elements_.end(), B.Elements_.begin(), T(0) * T(0)); }
227 T arg = A * B /
abs(A) /
abs(B);
230 if (std::isfinite(arg) and fabs(arg) > 1)
231 arg = (arg > 0) ? (T)1 : (T) - 1;
251 template <
typename T,
size_t N,
typename E1,
typename E2>
262 {
return A_[i] +
B_[i]; }
275 template <
typename T,
size_t N,
typename E1,
typename E2>
283 template <
typename T,
size_t N,
typename E1,
typename E2>
294 {
return A_[i] -
B_[i]; }
307 template <
typename T,
size_t N,
typename E1,
typename E2>
312 template <
typename T,
size_t N>
319 s.erase(s.size() - 2, 2);
325 template <
typename T,
size_t N>
326 std::ostream& operator<<(std::ostream& os, const Vector<T, N>& V)
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; }
335 template <
typename T,
size_t N>
337 {
return T(-1) * V; }
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; }
345 template <
typename T,
size_t N>
347 { std::transform(A.
begin(), A.
end(), A.
begin(), [&](
const T & v) {
return B * v;});
return A; }
350 template <
typename T,
size_t N>
352 {
auto v = A;
return v *= c;
return v; }
355 template <
typename T,
size_t N>
360 template <
typename T,
size_t N>
362 { std::transform(A.
begin(), A.
end(), A.
begin(), [&](
const T & v) {
return v / B;});
return A; }
365 template <
typename T,
size_t N>
367 {
auto v = A; v /= c;
return v; }
370 template <
typename T,
size_t N>
372 {
return sqrt(norm(A)); }
376 template <
typename T,
size_t N>
378 { T a =
abs(V);
return (a == 0) ? V : (T(1) / a) * V; }
381 template <
typename T,
size_t R,
size_t C>
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];
392 template <
typename T1,
typename T2,
size_t R,
size_t C>
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];
404 template <
typename T,
size_t N>
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];
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
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