30d29 < #include 422,727d420 < // ********************************************************************** < /* complex vector classes to follow */ < < template < CVectorBase::CVectorBase(std::complex value) < { < for (unsigned int i = 0; i < N; i++) < _val[i] = value; < } < < template < void CVectorBase::set(std::complex value) < { < for (unsigned int i = 0; i < N; i++) < _val[i] = value; < } < < template < std::complex & CVectorBase::operator[](int n) < { < return _val[n]; < } < < template < std::complex CVectorBase::operator[](int n) const < { < return _val[n]; < } < < template < CVectorBase CVectorBase::operator+(const CVectorBase &v) const < { < Math::CVectorBase r; < < for (unsigned int i = 0; i < N; i++) < r._val[i] = _val[i] + v._val[i]; < < return r; < } < < template < CVectorBase CVectorBase::operator-(const CVectorBase &v) const < { < Math::CVectorBase r; < < for (unsigned int i = 0; i < N; i++) < r._val[i] = _val[i] - v._val[i]; < < return r; < } < < template < CVectorBase CVectorBase::operator-() const < { < Math::CVectorBase r; < < for (unsigned int i = 0; i < N; i++) < r._val[i] = -_val[i]; < < return r; < } < < template < CVectorBase & CVectorBase::neg() < { < for (unsigned int i = 0; i < N; i++) < _val[i] = -_val[i]; < < return *this; < } < < template < const CVectorBase & CVectorBase::operator+=(const CVectorBase &v) < { < for (unsigned int i = 0; i < N; i++) < _val[i] += v._val[i]; < < return *this; < } < < template < const CVectorBase & CVectorBase::operator-=(const CVectorBase &v) < { < for (unsigned int i = 0; i < N; i++) < _val[i] -= v._val[i]; < < return *this; < } < < template < std::complex CVectorBase::operator*(const CVectorBase &v) const < { < std::complex r = 0; < < for (unsigned int i = 0; i < N; i++) < r += _val[i] * v._val[i]; < < return r; < } < < template < CVectorBase CVectorBase::mul(const CVectorBase &v) const < { < Math::CVectorBase r; < < for (unsigned int i = 0; i < N; i++) < r._val[i] = _val[i] * v._val[i]; < < return r; < } < < template < CVectorBase CVectorBase::operator/(const CVectorBase &v) const < { < Math::CVectorBase r; < < for (unsigned int i = 0; i < N; i++) < r._val[i] = _val[i] / v._val[i]; < < return r; < } < < template < CVectorBase CVectorBase::operator*(std::complex scale) const < { < Math::CVectorBase r; < < for (unsigned int i = 0; i < N; i++) < r._val[i] = scale * _val[i]; < < return r; < } < < template < CVectorBase CVectorBase::operator/(std::complex scale) const < { < Math::CVectorBase r; < < for (unsigned int i = 0; i < N; i++) < r._val[i] = _val[i] / scale; < < return r; < } < < template < const CVectorBase & CVectorBase::operator*=(std::complex scale) < { < for (unsigned int i = 0; i < N; i++) < _val[i] *= scale; < < return *this; < } < < template < const CVectorBase & CVectorBase::operator/=(std::complex scale) < { < for (unsigned int i = 0; i < N; i++) < _val[i] /= scale; < < return *this; < } < < template < std::complex CVectorBase::len() const < { < std::complex r = 0; < < for (unsigned int i = 0; i < N; i++) < r += square(_val[i]); < < return sqrt(r); < } < < template < const CVectorBase & CVectorBase::normalize() < { < return *this /= len(); < } < < template < CVectorBase CVectorBase::normalized() const < { < CVectorBase r = *this / len(); < return r; < } < < template < CVectorBase CVectorBase::magnitude(std::complex newlen) const < { < return *this * (newlen / len()); < } < < template < CVectorBase CVectorBase::select(unsigned int index, const CVectorBase v) const < { < Math::CVectorBase r; < < assert(index < N); < < for (unsigned int i = 0; i < N; i++) < r._val[i] = (i == index) ? _val[i] : v._val[i]; < < return r; < } < < template < CVectorBase CVectorBase::operator*(const Matrix &m) < { < CVectorBase r; < < for (int j = 0; j < N; j++) < { < std::complex s = 0; < < for (int k = 0; k < N; k++) < s += _val[k][j] * m._val[k]; < < r[j] = s; < } < < return r; < } < < template < inline bool CVectorBase::operator==(const CVectorBase &m) const < { < for (int j = 0; j < N; j++) < if (_val[j] != m._val[j]) < return false; < < return true; < } < < template < std::ostream & operator<<(std::ostream &o, const CVectorBase &v) < { < o << "["; < < for (unsigned int i = 0; i < N; i++) < { < o << v[i]; < if (i + 1 < N) < o << ", "; < } < < o << "]"; < < return o; < } < < // ********************************************************************** < < template < CVector::CVector() < { < } < < template < CVector::CVector(const CVectorBase &v) < : CVectorBase(v) < { < } < < < // ********************************************************************** < < CVector<2>::CVector() < { < } < < CVector<2>::CVector(const CVectorBase<2> &v) < : CVectorBase<2>(v) < { < } < < CVector<2>::CVector(std::complex x, std::complex y) < { < _val[0] = x; < _val[1] = y; < } < < std::complex CVector<2>::perp_product(const CVector<2> &v) const < { < return _val[0] * v._val[1] - _val[1] * v._val[0]; < } < < std::complex & CVector<2>::x() < { < return _val[0]; < } < < std::complex & CVector<2>::y() < { < return _val[1]; < } < < std::complex CVector<2>::x() const < { < return _val[0]; < } < < std::complex CVector<2>::y() const < { < return _val[1]; < } <