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();
223 r[0] = this->_buffer[1]*b.
_buffer[2] - this->_buffer[2]*b.
_buffer[1];
224 r[1] = this->_buffer[2]*b.
_buffer[0] - this->_buffer[0]*b.
_buffer[2];
225 r[2] = this->_buffer[0]*b.
_buffer[1] - this->_buffer[1]*b.
_buffer[0];
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>
668 return this->_buffer[i];
676template <
class T,
size_t size,
class DataContainer>
679 return this->_buffer[i];
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){
726 norm += this->_buffer[i]*this->_buffer[i] * weight.
_buffer[i]*weight.
_buffer[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>
789 T retVal=this->_buffer[0];
790 for (
size_t i=1; i<size; ++i){ retVal += this->_buffer[i]; }
797template <
class T,
size_t size,
class DataContainer>
800 T retVal=this->_buffer[0];
801 for (
size_t i=1; i<size; ++i){ retVal *= this->_buffer[i]; }
808template <
class T,
size_t size,
class DataContainer>
812 T m =
static_cast<T
>(
MLAbs(this->_buffer[i++]));
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){
825 this->_buffer[i] = this->_buffer[i] < buffer.
_buffer[i] ? this->_buffer[i] : buffer.
_buffer[i];
832template <
class T,
size_t size,
class DataContainer>
835 for (
size_t i=0; i<size; ++i){
836 this->_buffer[i] = this->_buffer[i] < buffer.
_buffer[i] ? buffer.
_buffer[i] :this->_buffer[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){
877 this->_buffer[i] =
static_cast<T
>( sqrt(this->_buffer[i]));
879 this->_buffer[i] =
static_cast<T
>(::sqrt(this->_buffer[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]; }
Base class of the FloatingPointVector class which holds the data buffer.
Template class for vector arithmetic with floating point data types.
FloatingPointVector(T value=T(0))
Default and value constructor.
FloatingPointVector< T, size, DataContainer > operator/(FloatingPointVector< T, size, DataContainer > lhs, MLdouble rhs)
Component wise division of lhs by specialized rhs of type MLdouble.
FloatingPointVector< T, size, DataContainer > & operator/=(FloatingPointVector< T, size, DataContainer > &op1, const FloatingPointVector< T, size, DataContainer > &op2)
Arithmetic assignment: Component wise division of *this by the values of a vector of the same size.
FloatingPointVector< T, size, DataContainer > operator*(FloatingPointVector< T, size, DataContainer > lhs, MLdouble rhs)
Component wise multiplication of lhs with rhs.
std::ostream & writeOut(std::ostream &os) const
Writes all components to ostream os starting from index 0 to size-1.
FloatingPointVector< T, size, DataContainer > compMax(FloatingPointVector< T, size, DataContainer > buffer1, const FloatingPointVector< T, size, DataContainer > &buffer2)
Component wise maximum of buffer1 and buffer2.
void clampMax(const FloatingPointVector< T, size, DataContainer > &upper)
Calculates and sets all components clamped to upper, i.e., if any component is greater than the corre...
void compMin(FloatingPointVector< T, size, DataContainer > buffer)
Sets the component wise minimum of *this and buffer in *this.
T & operator[](const size_t i)
Indexing operators.
FloatingPointVector< T, size, DataContainer > & operator*=(FloatingPointVector< T, size, DataContainer > &op1, const FloatingPointVector< T, size, DataContainer > &op2)
Arithmetic assignment: Component wise multiplication *this with a vector of the same size.
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)
Calculates and sets all components of *this so that they are between minimum min and maximum max.
FloatingPointVector< T, size, DataContainer > & operator/=(FloatingPointVector< T, size, DataContainer > &op1, MLdouble value)
Arithmetic assignment: Component wise division of *this by scalar value.
FloatingPointVector< T, size, DataContainer > operator+(const FloatingPointVector< T, size, DataContainer > &buffer)
Unary plus, for completeness and for those who really want to use that...
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)
Arithmetic assignment: Component wise subtraction of buffer from *this.
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)
Returns a new vector with all components from vec clamped to range [lower, upper].
FloatingPointVector< T, 3, DataContainer > cross(const FloatingPointVector< T, 3, DataContainer > &b) const
Returns the cross product for elements, i.e., return vector vertical to *this and b.
T normalize()
Normalizes the buffer and returns the Euclidean length of vector before normalization,...
void compAbs()
Kills negative signs from all components.
const T & operator[](const size_t i) const
Constant indexing operators.
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).
void compDiv(const FloatingPointVector< T, size, DataContainer > &d)
Divides each vector component by the corresponding one of d.
T compMul() const
Returns the product of all vector components.
bool operator!(const FloatingPointVector< T, size, DataContainer > &a)
Returns whether all components are 0.
FloatingPointVector< T, size, DataContainer > & operator=(T value)
Assignment of scalar value to all components.
T compMul(const FloatingPointVector< T, size, DataContainer > &vec)
Returns the product of all components.
FloatingPointVector< T, size, DataContainer > clampMax(FloatingPointVector< T, size, DataContainer > vec, const FloatingPointVector< T, size, DataContainer > &m)
Returns a new vector with all components from vec clamped to maximum m.
FloatingPointVector< T, size, DataContainer > compSqrt(FloatingPointVector< T, size, DataContainer > vec)
Returns a vector with all components from vec square-rooted.
FloatingPointVector< T, size, DataContainer > compSqr(FloatingPointVector< T, size, DataContainer > vec)
Returns a vector with all components from vec squared.
T operator*(const FloatingPointVector< T, size, DataContainer > &a, const FloatingPointVector< T, size, DataContainer > &b)
Dot product, returns a.dot(b).
void compRound()
Rounds all components of this vector using floor(component + 0.5).
T norm2(const FloatingPointVector< T, size, DataContainer > &weight) const
Returns the weighted Euclidean norm, i.e., square root of sum of squares of all components multiplied...
T dot(const FloatingPointVector< T, size, DataContainer > &buffer) const
Returns the dot product, i.e., sum of all components multiplied with corresponding components of buff...
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 norm2() const
Returns the Euclidean norm (the vector length), i.e., square root of sum of squares of all components...
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)
Return value is the component wise addition of lhs and 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)
Component wise minimum of buffer1 and 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)
Calculates and sets all components clamped to lower, i.e., if any component is smaller than the corre...
void compSqrt()
Calculates and sets square root of all components.
FloatingPointVector< T, size, DataContainer > & operator+=(FloatingPointVector< T, size, DataContainer > &op1, const FloatingPointVector< T, size, DataContainer > &buffer)
Arithmetic assignment: Component wise addition.
FloatingPointVector< T, size, DataContainer > operator-(FloatingPointVector< T, size, DataContainer > lhs, const FloatingPointVector< T, size, DataContainer > &rhs)
Return value is the component wise subtraction of rhs from lhs.
FloatingPointVector< T, size, DataContainer > operator*(MLdouble lhs, FloatingPointVector< T, size, DataContainer > rhs)
Component wise multiplication of rhs with lhs.
FloatingPointVector< T, size, DataContainer > compAbs(FloatingPointVector< T, size, DataContainer > vec)
Returns a vector with all components from vec without negative sign.
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)
Arithmetic assignment: Component wise multiplication *this with specialized MLdouble scalar value.
FloatingPointVector< T, size, DataContainer > operator-(const FloatingPointVector< T, size, DataContainer > &buffer)
Unary minus, all components of the vector are multiplied with -1.
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)
Returns a new vector with all components from vec clamped to minimum 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)
Component wise division of vec / d.
bool MLValueIs0WOM(MLint8 a)
Returns true if value is 0, otherwise false.
DT MLAbs(const DT val)
Defines templated MLAbs version to circumvent fabs ambiguities on different platforms.
bool MLValuesDifferWOM(MLint8 a, MLint8 b)
Returns true if values differ, otherwise false.
double(* ML_LA_FROM_DOUBLE_TO_DOUBLE)(double)
Template base class for floating point vectors.
FloatingPointVector< T, size, DataContainer > compMax(FloatingPointVector< T, size, DataContainer > buffer1, const FloatingPointVector< T, size, DataContainer > &buffer2)
Component wise maximum of buffer1 and buffer2.
constexpr Is< T > is(T d)
FloatingPointVector< T, size, DataContainer > compMin(FloatingPointVector< T, size, DataContainer > buffer1, const FloatingPointVector< T, size, DataContainer > &buffer2)
Component wise minimum of buffer1 and buffer2.
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.