/*************************************************************************** * GVector.hpp - Vector class * * ----------------------------------------------------------------------- * * copyright (C) 2006-2014 by Juergen Knoedlseder * * ----------------------------------------------------------------------- * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ***************************************************************************/ /** * @file GVector.hpp * @brief Vector class interface definition * @author Juergen Knoedlseder */ #ifndef GVECTOR_HPP #define GVECTOR_HPP /* __ Includes ___________________________________________________________ */ #include #include #include "GBase.hpp" #include "GException.hpp" /***********************************************************************//** * @class GVector * * @brief Vector class * * This class implement a double precision floating point vector class that * is intended to be used for numerical computation (it is not meant to * replace the std::vector template class). ***************************************************************************/ class GVector : public GBase { // Friend functions friend GVector cross(const GVector& a, const GVector& b); friend double operator*(const GVector& a, const GVector& b); friend double norm(const GVector& vector); friend double min(const GVector& vector); friend double max(const GVector& vector); friend double sum(const GVector& vector); friend GVector perm(const GVector& vector, const int *p); friend GVector iperm(const GVector& vector, const int *p); friend GVector acos(const GVector& vector); friend GVector acosh(const GVector& vector); friend GVector asin(const GVector& vector); friend GVector asinh(const GVector& vector); friend GVector atan(const GVector& vector); friend GVector atanh(const GVector& vector); friend GVector cos(const GVector& vector); friend GVector cosh(const GVector& vector); friend GVector exp(const GVector& vector); friend GVector abs(const GVector& vector); friend GVector log(const GVector& vector); friend GVector log10(const GVector& vector); friend GVector sin(const GVector& vector); friend GVector sinh(const GVector& vector); friend GVector sqrt(const GVector& vector); friend GVector tan(const GVector& vector); friend GVector tanh(const GVector& vector); friend GVector pow(const GVector& vector, const double& power); public: // Constructors and destructors GVector(void); explicit GVector(const int& num); explicit GVector(const double& a); explicit GVector(const double& a, const double& b); explicit GVector(const double& a, const double& b, const double& c); GVector(const GVector& vector); virtual ~GVector(void); // Vector element access operators double& operator[](const int& index); const double& operator[](const int& index) const; // Vector operators bool operator==(const GVector& vector) const; bool operator!=(const GVector& vector) const; GVector& operator=(const GVector& vector); GVector& operator+=(const GVector& vector); GVector& operator-=(const GVector& vector); GVector& operator=(const double& scalar); GVector& operator+=(const double& scalar); GVector& operator-=(const double& scalar); GVector& operator*=(const double& scalar); GVector& operator/=(const double& scalar); GVector operator-(void) const; // Vector methods void clear(void); GVector* clone(void) const; std::string classname(void) const; const int& size(void) const; double& at(const int& index); const double& at(const int& index) const; int non_zeros(void) const; int first_nonzero(void) const; int last_nonzero(void) const; GVector slice(const int& start, const int& stop) const; std::string print(const GChatter& chatter = NORMAL) const; private: // Private methods void init_members(void); void alloc_members(void); void copy_members(const GVector& vector); void free_members(void); // Private data area int m_num; //!< Number of elements in vector double* m_data; //!< Vector array }; /***********************************************************************//** * @brief Return class name * * @return String containing the class name ("GVector"). ***************************************************************************/ inline std::string GVector::classname(void) const { return ("GVector"); } /***********************************************************************//** * @brief Vector element access operator * * @param[in] index Element index [0,...,size()-1] * @return Reference to vector element. ***************************************************************************/ inline double& GVector::operator[](const int& index) { // Return vector element return m_data[index]; } /***********************************************************************//** * @brief Vector element access operator (const variant) * * @param[in] index Element index [0,...,size()-1] * @return Reference to vector element. ***************************************************************************/ inline const double& GVector::operator[](const int& index) const { // Return vector element return m_data[index]; } /***********************************************************************//** * @brief Return size of vector * * @return Size of vector * * Returns the number of elements in the vector. ***************************************************************************/ inline const int& GVector::size() const { return m_num; } /***********************************************************************//** * @brief Add two vectors * * @param[in] a Vector. * @param[in] b Vector. * @return Sum of vectors @p a and @p b. * * Returns the sum of vectors @p a and @p b. ***************************************************************************/ inline GVector operator+(const GVector& a, const GVector& b) { GVector result = a; result += b; return result; } /***********************************************************************//** * @brief Add scalar to vector * * @param[in] vector Vector. * @param[in] scalar Scalar. * @return Vector with @p scalar added to all elements. * * Returns a vector for which the @p scalar has been added to all elements. ***************************************************************************/ inline GVector operator+(const GVector& vector, const double& scalar) { GVector result = vector; result += scalar; return result; } /***********************************************************************//** * @brief Add scalar to vector * * @param[in] scalar Scalar. * @param[in] vector Vector. * @return Vector with @p scalar added to all elements. * * Returns a vector for which the @p scalar has been added to all elements. ***************************************************************************/ inline GVector operator+(const double& scalar, const GVector& vector) { GVector result = vector; result += scalar; return result; } /***********************************************************************//** * @brief Subtract vector from vector * * @param[in] a Vector. * @param[in] b Vector. * @return Difference between vector @p a and @p b. * * Returns the difference between vector @p a and @p b. ***************************************************************************/ inline GVector operator- (const GVector& a, const GVector& b) { GVector result = a; result -= b; return result; } /***********************************************************************//** * @brief Subtract scalar from vector * * @param[in] vector Vector. * @param[in] scalar Scalar. * @return Vector with @p scalar subtracted from all elements. * * Returns a vector for which the @p scalar has been subtracted from all * elements. ***************************************************************************/ inline GVector operator-(const GVector& vector, const double& scalar) { GVector result = vector; result -= scalar; return result; } /***********************************************************************//** * @brief Subtract vector from scalar * * @param[in] scalar Scalar. * @param[in] vector Vector. * @return Vector with all elements subtracted from @p scalar. * * Returns a vector for which all elements have been subtracted from the * @p scalar. ***************************************************************************/ inline GVector operator-(const double& scalar, const GVector& vector) { GVector result = -vector; result += scalar; return result; } /***********************************************************************//** * @brief Multiply vector by scalar * * @param[in] vector Vector. * @param[in] scalar Scalar. * @return Vector for which all elements have be multiplied by @p scalar. * * Returns a vector for which all elements have be multiplied by @p scalar. ***************************************************************************/ inline GVector operator*(const GVector& vector, const double& scalar) { GVector result = vector; result *= scalar; return result; } /***********************************************************************//** * @brief Multiply vector by scalar * * @param[in] scalar Scalar. * @param[in] vector Vector. * @return Vector for which all elements have be multiplied by @p scalar. * * Returns a vector for which all elements have be multiplied by @p scalar. ***************************************************************************/ inline GVector operator*(const double& scalar, const GVector& vector) { GVector result = vector; result *= scalar; return result; } /***********************************************************************//** * @brief Divide vector by scalar * * @param[in] vector Vector. * @param[in] scalar Scalar. * @return Vector for which all elements have be divided by @p scalar. * * Returns a vector for which all elements have be divided by @p scalar. ***************************************************************************/ inline GVector operator/(const GVector& vector, const double& scalar) { GVector result = vector; result /= scalar; return result; } #endif /* GVECTOR_HPP */