10#ifndef MATH_VECTOR_HEADER
11#define MATH_VECTOR_HEADER
28template <
typename T,
int N>
class Vector;
85template <
typename T,
int N>
91 static int constexpr dim = N;
104 Vector (T
const& v1, T
const& v2, T
const& v3);
106 Vector (T
const& v1, T
const& v2, T
const& v3, T
const& v4);
114 template <
typename O>
118 template <
typename O>
178 template <
typename F>
181 template <
typename F>
208 T
const*
end (
void)
const;
215 T
const* operator* (
void)
const;
218 T& operator[] (
int index);
220 T
const& operator[] (
int index)
const;
223 T& operator() (
int index);
225 T
const& operator() (
int index)
const;
235 template <
typename O>
282template <
typename T,
int N>
285template <
typename T,
int N>
291template <
typename T,
int N>
295 std::copy(values, values + N, v);
298template <
typename T,
int N>
305template <
typename T,
int N>
309 v[0] = v1; v[1] = v2;
312template <
typename T,
int N>
316 v[0] = v1; v[1] = v2; v[2] = v3;
319template <
typename T,
int N>
323 v[0] = v1; v[1] = v2; v[2] = v3; v[3] = v4;
326template <
typename T,
int N>
330 std::copy(*other, *other + N-1, v);
334template <
typename T,
int N>
338 std::copy(*other, *other + N, v);
341template <
typename T,
int N>
346 std::copy(*other, *other + N, v);
349template <
typename T,
int N>
354 std::copy(values, values + N, v);
360template <
typename T,
int N>
364 throw std::invalid_argument(
"Only defined for 3-vectors");
373 v1[2] * v2[0] - v1[0] * v2[2],
374 v1[0] * v2[1] - v1[1] * v2[0]);
379template <
typename T,
int N>
383 std::fill(v, v + N, value);
387template <
typename T,
int N>
391 std::copy(values, values + num, this->v);
395template <
typename T,
int N>
399 return *std::min_element(v, v + N);
402template <
typename T,
int N>
406 return *std::max_element(v, v + N);
409template <
typename T,
int N>
413 return std::accumulate(v, v + N, T(0), std::plus<T>());
416template <
typename T,
int N>
420 return std::accumulate(v, v + N, T(0), &algo::accum_absolute_sum<T>);
423template <
typename T,
int N>
427 return std::accumulate(v, v + N, T(1), std::multiplies<T>());
432template <
typename T,
int N>
436 return std::sqrt(square_norm());
439template <
typename T,
int N>
443 return std::accumulate(v, v + N, T(0), &algo::accum_squared_sum<T>);
446template <
typename T,
int N>
454template <
typename T,
int N>
461template <
typename T,
int N>
465 std::for_each(v, v + N, &algo::foreach_absolute_value<T>);
469template <
typename T,
int N>
476template <
typename T,
int N>
480 std::for_each(v, v + N, &algo::foreach_negate_value<T>);
484template <
typename T,
int N>
491template <
typename T,
int N>
495 std::sort(v, v + N, std::less<T>());
499template <
typename T,
int N>
503 std::sort(v, v + N, std::greater<T>());
507template <
typename T,
int N>
514template <
typename T,
int N>
521template <
typename T,
int N>
526 std::for_each(v, v + N, functor);
530template <
typename T,
int N>
540template <
typename T,
int N>
544 return std::inner_product(v, v + N, *other, T(0));
547template <
typename T,
int N>
554template <
typename T,
int N>
559 std::transform(v, v + N, other.
v, ret.
v, std::multiplies<T>());
563template <
typename T,
int N>
568 std::transform(v, v + N, other.
v, ret.
v, std::divides<T>());
572template <
typename T,
int N>
581template <
typename T,
int N>
588template <
typename T,
int N>
595template <
typename T,
int N>
602template <
typename T,
int N>
611template <
typename T,
int N>
618template <
typename T,
int N>
625template <
typename T,
int N>
632template <
typename T,
int N>
639template <
typename T,
int N>
646template <
typename T,
int N>
653template <
typename T,
int N>
657 return std::equal(v, v + N, *rhs);
660template <
typename T,
int N>
664 return !std::equal(v, v + N, *rhs);
667template <
typename T,
int N>
671 std::copy(*rhs, *rhs + N, v);
675template <
typename T,
int N>
680 std::copy(*rhs, *rhs + N, v);
684template <
typename T,
int N>
691template <
typename T,
int N>
695 std::transform(v, v + N, *rhs, v, std::minus<T>());
699template <
typename T,
int N>
706template <
typename T,
int N>
710 std::transform(v, v + N, *rhs, v, std::plus<T>());
714template <
typename T,
int N>
721template <
typename T,
int N>
729template <
typename T,
int N>
736template <
typename T,
int N>
744template <
typename T,
int N>
751template <
typename T,
int N>
759template <
typename T,
int N>
766template <
typename T,
int N>
774template <
typename T,
int N>
784template <
typename T,
int N>
792template <
typename T,
int N>
800template <
typename T,
int N>
808template <
typename T,
int N>
812 return std::any_of(v.
begin(), v.
end(),
813 [](T
const& value) { return std::isnan(value); });
825template <
typename T,
int N>
829 for (
int i = 0; i < N - 1; ++i)
Vector class for arbitrary dimensions and types.
Vector< T, N > cw_mult(Vector< T, N > const &other) const
Component-wise multiplication with another vector.
T abs_sum(void) const
Returns the sum of the absolute values of all elements.
T square_norm(void) const
Computes the squared norm of the vector (much cheaper).
Vector< T, N > cross(Vector< T, N > const &other) const
Cross product between this and another vector.
T sum(void) const
Returns the sum of all elements.
T minimum(void) const
Returns the smallest element in the vector.
T product(void) const
Returns the product of all elements.
Vector< T, N > applied_for_each(F functor) const
Applies a for-each functor to a copy of the vector.
Vector(T const *values)
Ctor taking a pointer to initialize values.
Vector< T, N > cw_div(Vector< T, N > const &other) const
Component-wise division with another vector.
T norm(void) const
Computes the norm (length) of the vector.
T dot(Vector< T, N > const &other) const
Dot (or scalar) product between self and another vector.
Vector(T const &v1, T const &v2)
Ctor that initializes the first two elements.
Vector< T, N > & abs_value(void)
Component-wise absolute-value on self, returns self.
Vector< T, N > & sort_desc(void)
Sorts the elements of the vector into descending order.
Vector< T, N > sorted_asc(void) const
Returns a sorted vector into ascending order.
Vector< T, N > & fill(T const &value)
Fills all vector elements with the given value.
Vector(T const &v1, T const &v2, T const &v3)
Ctor that initializes the first three elements.
Vector(O const *values)
Ctor taking a pointer from different type to initialize values.
Vector< T, N > sorted_desc(void) const
Returns a sorted vector into descending order.
Vector(Vector< T, N > const &other)
Copy ctor from vector of same type.
Vector(Vector< T, N-1 > const &other, T const &v1)
Ctor that takes a smaller vector and one element.
T maximum(void) const
Returns the largest element in the vector.
Vector(void)
Default ctor.
Vector< T, N > & normalize(void)
Normalizes self and returns reference to self.
Vector(T const &v1, T const &v2, T const &v3, T const &v4)
Ctor that initializes the first four elements.
Vector< T, N > & apply_for_each(F functor)
Applies a for-each functor to all values.
T const * end(void) const
Vector(T const &value)
Ctor that initializes ALL elements.
Vector< T, N > normalized(void) const
Returns a normalized copy of self.
T const * begin(void) const
Vector< T, N > & copy(T const *values, int num=N)
Copies values from the given pointer.
bool is_similar(Vector< T, N > const &other, T const &epsilon) const
Component-wise similarity using epsilon checks.
Vector< T, N > & negate(void)
Component-wise negation on self, returns self.
Vector< T, N > abs_valued(void) const
Returns a component-wise absolute-value copy of self.
Vector< T, N > & sort_asc(void)
Sorts the elements of the vector into ascending order.
Vector(Vector< O, N > const &other)
Copy ctor from vector of different type.
Vector< T, N > negated(void) const
Returns a component-wise negation on copy of self.
#define MATH_NAMESPACE_BEGIN
#define MATH_NAMESPACE_END
Vector< T, N > cross_product(Vector< T, N > const &, Vector< T, N > const &)
Cross product template for partial specialization.
bool isnan(Vector< T, N > const &v)
Tests if any of the vector values is NaN.
for-each functor: adds a constant value to operand.
for-each functor: divides operand by constant divisor.
for-each functor: multiplies operand with constant factor.
for-each functor: substracts a constant value to operand.
Epsilon comparator predicate.