1 #ifndef MSP_LINAL_DYNAMICVECTOR_H_
2 #define MSP_LINAL_DYNAMICVECTOR_H_
12 class size_mismatch: public std::logic_error
15 size_mismatch(const std::string &w): std::logic_error(w) { }
16 virtual ~size_mismatch() throw() { }
21 A general mathematical vector. Size is specified at runtime. May be slower
22 than a fixed-size vector. There are no compile-time diagnostics for mismatched
29 typedef T ElementType;
36 DynamicVector(unsigned);
37 DynamicVector(unsigned, const T *);
38 DynamicVector(const DynamicVector &);
39 DynamicVector &operator=(const DynamicVector &);
42 unsigned size() const { return size_; }
44 T &operator[](unsigned);
45 const T &operator[](unsigned) const;
47 DynamicVector &operator*=(T);
48 DynamicVector &operator/=(T);
49 DynamicVector &operator+=(const DynamicVector &);
50 DynamicVector &operator-=(const DynamicVector &);
53 DynamicVector &normalize();
57 inline DynamicVector<T>::DynamicVector(unsigned s):
61 std::fill(data, data+size_, T());
65 inline DynamicVector<T>::DynamicVector(unsigned s, const T *d):
69 std::copy(d, d+size_, data);
73 inline DynamicVector<T>::DynamicVector(const DynamicVector &other):
77 std::copy(other.data, other.data+size_, data);
81 inline DynamicVector<T> &DynamicVector<T>::operator=(const DynamicVector<T> &other)
83 if(size_!=other.size())
90 std::copy(other.data, other.data+size_, data);
96 inline DynamicVector<T>::~DynamicVector()
102 inline T &DynamicVector<T>::operator[](unsigned i)
105 throw std::out_of_range("DynamicVector::operator[]");
111 inline const T &DynamicVector<T>::operator[](unsigned i) const
114 throw std::out_of_range("DynamicVector::operator[]");
120 inline DynamicVector<T> &DynamicVector<T>::operator*=(T s)
122 for(unsigned i=0; i<size_; ++i)
128 inline DynamicVector<T> operator*(const DynamicVector<T> &v, T s)
130 DynamicVector<T> r(v);
135 inline DynamicVector<T> operator*(T s, const DynamicVector<T> &v)
141 inline DynamicVector<T> &DynamicVector<T>::operator/=(T s)
143 for(unsigned i=0; i<size_; ++i)
149 inline DynamicVector<T> operator/(const DynamicVector<T> &v, T s)
151 DynamicVector<T> r(v);
156 inline DynamicVector<T> &DynamicVector<T>::operator+=(const DynamicVector<T> &v)
159 throw size_mismatch("vector+vector");
161 for(unsigned i=0; i<size_; ++i)
162 data[i] += v.data[i];
168 inline DynamicVector<T> operator+(const DynamicVector<T> &v1, const DynamicVector<T> &v2)
170 DynamicVector<T> r(v1);
175 inline DynamicVector<T> &DynamicVector<T>::operator-=(const DynamicVector<T> &v)
178 throw size_mismatch("vector-vector");
180 for(unsigned i=0; i<size_; ++i)
181 data[i] -= v.data[i];
187 inline DynamicVector<T> operator-(const DynamicVector<T> &v1, const DynamicVector<T> &v2)
189 DynamicVector<T> r(v1);
194 inline DynamicVector<T> operator-(const DynamicVector<T> &v)
196 DynamicVector<T> r(v);
197 for(unsigned i=0; i<r.size(); ++i)
203 inline bool operator==(const DynamicVector<T> &v1, const DynamicVector<T> &v2)
205 if(v1.size()!=v2.size())
206 throw size_mismatch("vector==vector");
208 for(unsigned i=0; i<v1.size(); ++i)
216 inline T inner_product(const DynamicVector<T> &v1, const DynamicVector<T> &v2)
218 if(v1.size()!=v2.size())
219 throw size_mismatch("inner_product");
222 for(unsigned i=0; i<v1.size(); ++i)
228 inline T DynamicVector<T>::norm() const
231 return sqrt(inner_product(*this, *this));
235 inline DynamicVector<T> &DynamicVector<T>::normalize()
237 return *this /= norm();
241 inline DynamicVector<T> normalize(const DynamicVector<T> &v)
243 DynamicVector<T> r(v);
244 return r.normalize();
248 inline std::ostream &operator<<(std::ostream &s, const DynamicVector<T> &v)
250 s << "DynamicVector" << v.size() << '(';
251 for(unsigned i=0; i<v.size(); ++i)