Templates -- Meow  1.1.2
不能,也不應該先編譯成obj-file的templates
Vector.h
Go to the documentation of this file.
1 #ifndef math_Vector_H__
2 #define math_Vector_H__
3 
4 #include "../Self.h"
5 #include "Matrix.h"
6 #include "utility.h"
7 
8 #include <vector>
9 
10 #include <cmath>
11 
12 namespace meow {
13 
19 template<class Scalar>
20 class Vector {
21 private:
22  Matrix<Scalar> matrix_;
23 public:
29  Vector(){
30  }
31 
39  Vector(Vector const& v) {
40  matrix_.copyFrom(v.matrix_);
41  }
42 
50  Vector(Matrix<Scalar> const& m) {
51  matrix_.copyFrom(m.col(0));
52  }
53 
62  Vector(Matrix<Scalar> const& m, size_t i) {
63  matrix_.copyFrom(m.col(i));
64  }
65 
73  Vector(std::vector<Scalar> const& v) {
74  matrix_.size(v.size(), 1, Scalar(0));
75  for (size_t i = 0, I = v.size(); i < I; i++) {
76  matrix_.entry(i, 0, v[i]);
77  }
78  }
79 
88  Vector(size_t d, Scalar const& e) {
89  matrix_.reset(d, 1, e);
90  }
91 
94  }
95 
97  Vector& copyFrom(Vector const& v) {
98  matrix_.copyFrom(v.matrix_);
99  return *this;
100  }
101 
104  matrix_.referenceFrom(v.matrix_);
105  return *this;
106  }
107 
109  Matrix<Scalar> const& matrix() const {
110  return matrix_;
111  }
112 
114  size_t dimension() const {
115  return matrix_.rows();
116  }
117 
125  size_t dimension(size_t d, Scalar const& s) {
126  matrix_.rows(d, s);
127  return dimension();
128  }
129 
134  bool valid() const {
135  return (dimension() > 0);
136  }
137 
139  Scalar entry(size_t i) const {
140  return matrix_.entry(i, 0);
141  }
142 
149  Scalar entry(size_t i, Scalar const& s) {
150  matrix_.entry(i, 0, s);
151  return entry(i);
152  }
153 
161  void entries(size_t i, size_t j, Scalar const& s) {
162  for (size_t it = i; it <= j; it++) {
163  matrix_.entry(it, 0, s);
164  }
165  }
166 
168  Vector subVector(size_t i, size_t j) {
169  return Vector(matrix_.subMatrix(i, 0, j, 0));
170  }
171 
173  Vector positive() const {
174  return *this;
175  }
176 
178  Vector negative() const {
179  return Vector(matrix_.negative());
180  }
181 
183  Vector add(Vector const& v) const {
184  return Vector(matrix_.add(v.matrix_));
185  }
186 
188  Vector sub(Vector const& v) const {
189  return Vector(matrix_.sub(v.matrix_));
190  }
191 
193  Vector mul(Scalar const& s) const {
194  return Vector(matrix_.mul(s));
195  }
196 
198  Vector div(Scalar const& s) const {
199  return Vector(matrix_.div(s));
200  }
201 
203  Scalar dot(Vector const& v) const {
204  return matrix_.transpose().mul(v.matrix_).entry(0, 0);
205  }
206 
208  Scalar length() const {
209  return Scalar(sqrt((double)length2()));
210  }
211 
213  Scalar length2() const {
214  return dot(*this);
215  }
216 
218  Vector normalize() const {
219  return div(length());
220  }
221 
224  copyFrom(normalize());
225  return *this;
226  }
227 
229  Vector& operator=(Vector const& v) {
230  return copyFrom(v);
231  }
232 
234  Scalar operator()(size_t i) const {
235  return entry(i);
236  }
237 
239  Vector operator+() const {
240  return positive();
241  }
242 
244  Vector operator-() const {
245  return negative();
246  }
247 
249  Vector operator+(Vector const& v) const {
250  return add(v);
251  }
252 
254  Vector operator-(Vector const& v) const {
255  return sub(v);
256  }
257 
259  Scalar operator*(Vector const& v) const {
260  return dot(v);
261  }
262 
264  Vector operator*(Scalar const& s) const {
265  return mul(s);
266  }
267 
269  Vector operator/(Scalar const& s) const {
270  return div(s);
271  }
272 };
273 
274 }
275 
276 #endif // math_Vector_H__