13#ifndef ML_FLOATING_POINT_VECTOR_H
14#define ML_FLOATING_POINT_VECTOR_H
40template <
class DT,
size_t size>
61template <
class T,
size_t size,
class DataContainer = FloatingPo
intVectorDataContainerBase<T, size> >
153 return (*
this - buffer).length();
159 return (*
this - buffer).lengthSquared();
251template <
class T,
size_t size,
class DataContainer>
254 for (
size_t i=0; i<size; ++i){ op1[i] += buffer[i]; }
262template <
class T,
size_t size,
class DataContainer>
265 for (
size_t i=0; i<size; ++i){ op1[i] -= buffer[i]; }
273template <
class T,
size_t size,
class DataContainer>
276 for (
size_t i=0; i<size; ++i){ op1[i] *=
static_cast<T
>(value); }
284template <
class T,
size_t size,
class DataContainer>
287 for (
size_t i=0; i<size; ++i){ op1[i] *= op2[i]; }
296template <
class T,
size_t size,
class DataContainer>
302 for (
size_t i=0; i<size; ++i){ op1[i] /=
static_cast<T
>(value); }
311template <
class T,
size_t size,
class DataContainer>
317 for (
size_t i=0; i<size; ++i){ op1[i] /= op2[i]; }
325template <
class T,
size_t size,
class DataContainer>
329 for (
size_t c=1; c<size; c++){ v &= !a[c]; }
337template <
class T,
size_t size,
class DataContainer>
348template <
class T,
size_t size,
class DataContainer>
359template <
class T,
size_t size,
class DataContainer>
370template <
class T,
size_t size,
class DataContainer>
374 for (
size_t i=0; i<size; ++i){ buf[i] *= -1; }
382template <
class T,
size_t size,
class DataContainer>
392template <
class T,
size_t size,
class DataContainer>
395 return lhs *=
static_cast<T
>(rhs);
402template <
class T,
size_t size,
class DataContainer>
405 return rhs *=
static_cast<T
>(lhs);
412template <
class T,
size_t size,
class DataContainer>
415 return lhs /=
static_cast<T
>(rhs);
422template <
class T,
size_t size,
class DataContainer>
434template <
class T,
size_t size,
class DataContainer>
446template <
class T,
size_t size,
class DataContainer>
457template <
class T,
size_t size,
class DataContainer>
469template <
class T,
size_t size,
class DataContainer>
481template <
class T,
size_t size,
class DataContainer>
494template <
class T,
size_t size,
class DataContainer>
507template <
class T,
size_t size,
class DataContainer>
522template <
class T,
size_t size,
class DataContainer>
536template <
class T,
size_t size,
class DataContainer>
553 template <
class T,
size_t size,
class DataContainer>
554 inline ostream&
operator<<(ostream& os,
const ML_LA_NAMESPACE::FloatingPointVector<T, size, DataContainer>& v)
556 return v.writeOut(os);
562 template <
class T,
size_t size,
class DataContainer>
563 inline istream&
operator>>(istream& is, ML_LA_NAMESPACE::FloatingPointVector<T, size, DataContainer>& v)
585template <
class T,
size_t size,
class DataContainer>
588 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] = value; }
594template <
class T,
size_t size,
class DataContainer>
597 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] = value; }
608template <
class T,
size_t size,
class DataContainer>
611 for (
size_t i=0; i<size; ++i){
623template <
class T,
size_t size,
class DataContainer>
626 for (
size_t i=0; i<size; ++i){
644template <
class T,
size_t size,
class DataContainer>
647 for (
size_t i=0; i<size; ++i) {
665template <
class T,
size_t size,
class DataContainer>
676template <
class T,
size_t size,
class DataContainer>
695template <
class T,
size_t size,
class DataContainer>
705template <
class T,
size_t size,
class DataContainer>
709 for (
size_t i=0; i<size; ++i){ norm += this->
_buffer[i]*this->
_buffer[i]; }
711 return static_cast<T
>(
sqrt(norm));
713 return static_cast<T
>(
::sqrt(norm));
721template <
class T,
size_t size,
class DataContainer>
725 for (
size_t i=0; i<size; ++i){
740template <
class T,
size_t size,
class DataContainer>
744 for (
size_t i=0; i<size; ++i){ sum += this->
_buffer[i]*buffer.
_buffer[i]; }
752template <
class T,
size_t size,
class DataContainer>
758 T inv_norm =
static_cast<T
>(1.0/norm);
759 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] *= inv_norm; }
768template <
class T,
size_t size,
class DataContainer>
777template <
class T,
size_t size,
class DataContainer>
786template <
class T,
size_t size,
class DataContainer>
790 for (
size_t i=1; i<size; ++i){ retVal += this->
_buffer[i]; }
797template <
class T,
size_t size,
class DataContainer>
801 for (
size_t i=1; i<size; ++i){ retVal *= this->
_buffer[i]; }
808template <
class T,
size_t size,
class DataContainer>
814 for (; i<size; ++i){ m = (n =
static_cast<T
>(
MLAbs(this->
_buffer[i])) ) > m ? n : m; }
821template <
class T,
size_t size,
class DataContainer>
824 for (
size_t i=0; i<size; ++i){
832template <
class T,
size_t size,
class DataContainer>
835 for (
size_t i=0; i<size; ++i){
843template <
class T,
size_t size,
class DataContainer>
846 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] =
static_cast<T
>(
MLAbs(this->
_buffer[i])); }
853template <
class T,
size_t size,
class DataContainer>
856 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] /= d.
_buffer[i]; }
862template <
class T,
size_t size,
class DataContainer>
865 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] *= this->
_buffer[i]; }
872template <
class T,
size_t size,
class DataContainer>
875 for (
size_t i=0; i<size; ++i){
888template <
class T,
size_t size,
class DataContainer>
898template <
class T,
size_t size,
class DataContainer>
911template <
class T,
size_t size,
class DataContainer>
925template <
class T,
size_t size,
class DataContainer>
928 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] = std::floor(this->
_buffer[i] +
static_cast<T
>(0.5)); }
934template <
class T,
size_t size,
class DataContainer>
937 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] = std::floor(this->
_buffer[i]); }
943template <
class T,
size_t size,
class DataContainer>
946 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] = std::ceil(this->
_buffer[i]); }
952template <
class T,
size_t size,
class DataContainer>
955 for (
size_t i=0; i<size; ++i){ this->
_buffer[i] = f(this->
_buffer[i]); }
962template <
class T,
size_t size,
class DataContainer>
965 for (
size_t i=0; i<size; ++i){ os << this->
_buffer[i] <<
" "; }
972template <
class T,
size_t size,
class DataContainer>
975 for (
size_t i=0; i<size; ++i){
is >> this->
_buffer[i]; }
FloatingPointVector(T value=T(0))
FloatingPointVector< T, size, DataContainer > operator/(FloatingPointVector< T, size, DataContainer > lhs, MLdouble rhs)
FloatingPointVector< T, size, DataContainer > & operator/=(FloatingPointVector< T, size, DataContainer > &op1, const FloatingPointVector< T, size, DataContainer > &op2)
FloatingPointVector< T, size, DataContainer > operator*(FloatingPointVector< T, size, DataContainer > lhs, MLdouble rhs)
std::ostream & writeOut(std::ostream &os) const
FloatingPointVector< T, size, DataContainer > compMax(FloatingPointVector< T, size, DataContainer > buffer1, const FloatingPointVector< T, size, DataContainer > &buffer2)
void clampMax(const FloatingPointVector< T, size, DataContainer > &upper)
void compMin(FloatingPointVector< T, size, DataContainer > buffer)
Sets the component-wise minimum of *this and buffer in *this.
T & operator[](const size_t i)
FloatingPointVector< T, size, DataContainer > & operator*=(FloatingPointVector< T, size, DataContainer > &op1, const FloatingPointVector< T, size, DataContainer > &op2)
T length() const
Returns the length of the vector, i.e., norm2().
void clamp(const FloatingPointVector< T, size, DataContainer > &lower, const FloatingPointVector< T, size, DataContainer > &upper)
FloatingPointVector< T, size, DataContainer > & operator/=(FloatingPointVector< T, size, DataContainer > &op1, MLdouble value)
FloatingPointVector< T, size, DataContainer > operator+(const FloatingPointVector< T, size, DataContainer > &buffer)
bool operator==(const FloatingPointVector< T, size, DataContainer > &buffer) const
Returns whether *this and buffer are component-wise equal.
FloatingPointVector< T, size, DataContainer > & operator-=(FloatingPointVector< T, size, DataContainer > &op1, const FloatingPointVector< T, size, DataContainer > &buffer)
void compMax(FloatingPointVector< T, size, DataContainer > buffer)
Sets the component-wise maximum of *this and buffer in *this.
FloatingPointVector< T, size, DataContainer > clamp(FloatingPointVector< T, size, DataContainer > vec, const FloatingPointVector< T, size, DataContainer > &lower, const FloatingPointVector< T, size, DataContainer > &upper)
FloatingPointVector< T, 3, DataContainer > cross(const FloatingPointVector< T, 3, DataContainer > &b) const
Returns the cross product for elements, i.e., the returned vector is orthogonal to *this and b.
void compAbs()
Kills negative signs from all components.
const T & operator[](const size_t i) const
T distance(const FloatingPointVector< T, size, DataContainer > &buffer) const
Returns the distance of this vector to a given one.
T compMaxAbs() const
Returns the maximum of absolute component values.
void compFloor()
Rounds all components of this vector using floor(component).
bool operator<(const FloatingPointVector< T, size, DataContainer > &buffer) const
void compDiv(const FloatingPointVector< T, size, DataContainer > &d)
T compMul() const
Returns the product of all vector components.
bool operator!(const FloatingPointVector< T, size, DataContainer > &a)
FloatingPointVector< T, size, DataContainer > & operator=(T value)
Assignment of scalar value to all components.
T compMul(const FloatingPointVector< T, size, DataContainer > &vec)
FloatingPointVector< T, size, DataContainer > clampMax(FloatingPointVector< T, size, DataContainer > vec, const FloatingPointVector< T, size, DataContainer > &m)
FloatingPointVector< T, size, DataContainer > compSqrt(FloatingPointVector< T, size, DataContainer > vec)
FloatingPointVector< T, size, DataContainer > compSqr(FloatingPointVector< T, size, DataContainer > vec)
T operator*(const FloatingPointVector< T, size, DataContainer > &a, const FloatingPointVector< T, size, DataContainer > &b)
void compRound()
Rounds all components of this vector using floor(component + 0.5).
T norm2(const FloatingPointVector< T, size, DataContainer > &weight) const
T dot(const FloatingPointVector< T, size, DataContainer > &buffer) const
void compSqr()
Calculates and sets the square of all components.
bool operator!=(const FloatingPointVector< T, size, DataContainer > &buffer) const
Returns whether any components of *this and buffer are not equal.
T compSum() const
Returns the sum of all components.
FloatingPointVector< T, size, DataContainer > operator+(FloatingPointVector< T, size, DataContainer > lhs, const FloatingPointVector< T, size, DataContainer > &rhs)
std::istream & readIn(std::istream &is)
Reads all components from istream is starting starting from index 0 to size-1.
FloatingPointVector< T, size, DataContainer > compMin(FloatingPointVector< T, size, DataContainer > buffer1, const FloatingPointVector< T, size, DataContainer > &buffer2)
void compCeil()
Rounds all components of this vector to integer using ceil(component).
size_t getSize() const
Returns the number of elements of value buffer.
void clampMin(const FloatingPointVector< T, size, DataContainer > &lower)
FloatingPointVector< T, size, DataContainer > & operator+=(FloatingPointVector< T, size, DataContainer > &op1, const FloatingPointVector< T, size, DataContainer > &buffer)
FloatingPointVector< T, size, DataContainer > operator-(FloatingPointVector< T, size, DataContainer > lhs, const FloatingPointVector< T, size, DataContainer > &rhs)
FloatingPointVector< T, size, DataContainer > operator*(MLdouble lhs, FloatingPointVector< T, size, DataContainer > rhs)
FloatingPointVector< T, size, DataContainer > compAbs(FloatingPointVector< T, size, DataContainer > vec)
T distanceSquared(const FloatingPointVector< T, size, DataContainer > &buffer) const
Returns the squared distance of this vector to a given one.
void apply(ML_LA_FROM_DOUBLE_TO_DOUBLE f)
Applies the function f to each component starting from index 0 to index size-1.
FloatingPointVector< T, size, DataContainer > & operator*=(FloatingPointVector< T, size, DataContainer > &op1, MLdouble value)
FloatingPointVector< T, size, DataContainer > operator-(const FloatingPointVector< T, size, DataContainer > &buffer)
T ComponentType
A typedef to 'export' the type of components.
FloatingPointVector< T, size, DataContainer > clampMin(FloatingPointVector< T, size, DataContainer > vec, const FloatingPointVector< T, size, DataContainer > &m)
T lengthSquared() const
Returns the squared length of the vector.
FloatingPointVector< T, size, DataContainer > compDiv(FloatingPointVector< T, size, DataContainer > vec, const FloatingPointVector< T, size, DataContainer > &d)
bool MLValueIs0WOM(MLint8 a)
bool MLValuesDifferWOM(MLint8 a, MLint8 b)
double(* ML_LA_FROM_DOUBLE_TO_DOUBLE)(double)
Template base class for floating point vectors.
constexpr Is< T > is(T d)
MLEXPORT std::ostream & operator<<(std::ostream &s, const ml::Field &v)
Overloads the operator '<<' for stream output of Field objects.
istream & operator>>(istream &is, ml::FloatingPointVector< T, size, DataContainer > &v)
Reads a vector from std::istream.