22 #ifndef KJB_M_VECTOR_D_H
23 #define KJB_M_VECTOR_D_H
25 #include <boost/array.hpp>
29 #ifdef KJB_HAVE_BST_SERIAL
30 #include <boost/serialization/access.hpp>
55 template<std::
size_t D>
56 class Vector_d :
public boost::array<double, D>
58 typedef typename boost::array<double, D> Base;
60 #ifdef KJB_HAVE_BST_SERIAL
61 friend class boost::serialization::access;
65 using typename Base::value_type;
66 using typename Base::difference_type;
67 using typename Base::size_type;
68 using typename Base::reference;
69 using typename Base::const_reference;
70 using typename Base::iterator;
71 using typename Base::const_iterator;
79 Vector_d(
const Vector_d<D-1>& v,
double fill1);
83 Vector_d(
const Vector_d<D-1>& v,
double fill1,
double fill2);
87 template <
class Iterator>
93 std::copy(begin, end, this->begin());
127 void set_x(
double xv) ;
142 void set_y(
double yv) ;
156 void set_z(
double zv) ;
172 void set_w(
double wv);
195 double norm1()
const;
211 #ifdef KJB_HAVE_BST_SERIAL
212 template <
class Archive>
213 void serialize(Archive &ar,
const unsigned int );
225 template <std::
size_t D>
226 Vector
operator*(
const Matrix&
m,
const Vector_d<D> v);
236 template <std::
size_t D_out, std::
size_t D_in>
237 Vector_d<D_out>
operator*(
const Matrix_d<D_out, D_in>&
m,
const Vector_d<D_in> v)
239 Vector_d<D_out> result();
241 for (
int row = 0; row < D_out; row++)
245 for (
size_t col = 0; col < D_in; col++)
247 x +=
m(row, col) * v[col];
264 template <std::
size_t D>
265 Vector_d<D>
operator-(
const Vector_d<D>& first,
const Vector_d<D>& second);
267 template <std::
size_t D>
268 Vector_d<D>
operator-(
const Vector_d<D>& first,
double second);
270 template <std::
size_t D>
271 Vector_d<D>
operator-(
double first,
const Vector_d<D>& second);
273 template <std::
size_t D>
274 Vector_d<D>
operator-(
const Vector_d<D>& first );
276 template <std::
size_t D>
277 Vector_d<D>
operator+(
const Vector_d<D>& first,
const Vector_d<D>& second);
279 template <std::
size_t D>
280 Vector_d<D>
operator+(
const Vector_d<D>& first,
double second);
282 template <std::
size_t D>
283 Vector_d<D>
operator+(
double first,
const Vector_d<D>& second);
285 template <std::
size_t D>
286 Vector_d<D>
operator*(
const Vector_d<D>& v,
double s);
288 template <std::
size_t D>
289 Vector_d<D>
operator*(
double s,
const Vector_d<D>& v);
291 template <std::
size_t D>
292 Vector_d<D>
operator/(
const Vector_d<D>& v,
double s);
294 template<std::
size_t N>
295 void swap(Vector_d<N>& first, Vector_d<N>& second);
298 template<std::
size_t N>
299 bool operator==(
const Vector_d<N>& first,
const Vector_d<N>& second);
301 template<std::
size_t N>
302 bool operator!=(
const Vector_d<N>& first,
const Vector_d<N>& second);
304 template<std::
size_t N>
305 bool operator<(const Vector_d<N>& first,
const Vector_d<N>& second);
307 template<std::
size_t N>
308 bool operator>(
const Vector_d<N>& first,
const Vector_d<N>& second);
310 template<std::
size_t N>
311 bool operator<=(const Vector_d<N>& first,
const Vector_d<N>& second);
313 template<std::
size_t N>
314 bool operator>=(
const Vector_d<N>& first,
const Vector_d<N>& second);
338 return create_random_vector<2>();
343 return create_random_vector<3>();
348 return create_random_vector<4>();
364 template <std::
size_t D>
365 std::ostream& operator<<(std::ostream& out, const Vector_d<D>& v);
367 template <std::
size_t D>
368 std::istream&
operator>>(std::istream& ist, Vector_d<D>& v);
370 template <std::
size_t D>
371 double dot(
const Vector_d<D>& op1,
const Vector_d<D>& op2);
378 template <std::
size_t D>
379 double vector_distance(
const Vector_d<D>& op1,
const Vector_d<D>& op2);
381 template <std::
size_t D>
390 out[0] = op1[1] * op2[2] - op1[2] * op2[1];
391 out[1] = op1[2] * op2[0] - op1[0] * op2[2];
392 out[2] = op1[0] * op2[1] - op1[1] * op2[0];
Vector_d()
default constructor
Definition: m_vector_d.impl.h:46
void set_z(double zv)
Changes the third element of a vector (if it exists).
Definition: m_vector_d.impl.h:230
double vector_distance(const Int_vector &op1, const Int_vector &op2)
Compute the Euclidian distance between two vectors.
Definition: l_int_vector.h:1569
Int_vector cross(const Int_vector &op1, const Int_vector &op2)
Compute cross product of op1 and op2.
Definition: l_int_vector.cpp:381
Vector_d< 4 > Vector4
Definition: gr_opengl.h:38
double magnitude() const
return the l2-norm of this vector
Definition: m_vector_d.impl.h:369
double vector_distance_squared(const Int_vector &op1, const Int_vector &op2)
Compute the square of the Euclidian distance between two vectors.
Definition: l_int_vector.h:1581
Vector create_random_vector(int length)
Construct a vector with values drawn from a uniform distribution over [0,1].
Definition: m_vector.h:1643
Vector_d< 3 > Vector3
Definition: g_quaternion.h:37
void set_x(double xv)
Definition: m_vector_d.impl.h:159
Vector_d< D > & operator/=(double s)
Definition: m_vector_d.impl.h:332
void swap(Perspective_camera &cam1, Perspective_camera &cam2)
Swap two cameras.
Definition: perspective_camera.h:599
double y() const
Definition: m_vector_d.impl.h:169
Vector4 create_random_vector4()
Definition: m_vector_d.h:346
double z() const
Definition: m_vector_d.impl.h:205
Vector_d< D > normalized() const
Non-mutating (functionally pure) version of normalize()
Definition: m_vector_d.impl.h:384
Vector2 create_random_vector2()
Definition: m_vector_d.h:336
Image operator-(const Image &im1, const Image &im2)
Subtract two images.
Definition: i_image.h:843
This class implements vectors, in the linear-algebra sense, with real-valued elements.
Definition: m_vector.h:87
void set_w(double wv)
Changes the fourth element of a vector (if it exists).
Definition: m_vector_d.impl.h:262
bool operator>=(const Int_vector &op1, const Int_vector &op2)
Test lexicographic ordering between vectors.
Definition: l_int_vector.h:1494
Vector_d< D > & operator*=(double s)
Definition: m_vector_d.impl.h:321
std::istream & operator>>(std::istream &ist, Detection_type &type)
Stream in an detection.
Definition: d_type.cpp:91
void resize(size_t n)
Definition: m_vector_d.impl.h:339
Image operator+(const Image &op1, const Image &op2)
Add two images.
Definition: i_image.h:834
double x() const
Definition: m_vector_d.impl.h:134
Vector2 make_vector2(const Vector &v)
Definition: m_vector_d.cpp:121
Vector3 make_vector3(const Vector &v)
Definition: m_vector_d.cpp:128
Vector_d< D > & operator-=(const Vector_d< D > &second)
Definition: m_vector_d.impl.h:289
Vector4 make_vector4(const Vector &v)
Definition: m_vector_d.cpp:135
double w() const
read fourth element (i.e., index 3) of vector, if it exists.
Definition: m_vector_d.impl.h:241
Vector_d< D > & operator+=(const Vector_d< D > &second)
Definition: m_vector_d.impl.h:305
x
Definition: APPgetLargeConnectedEdges.m:100
Vector_d< D > & normalize()
normalize this vector to have l2-norm of 1.0
Definition: m_vector_d.impl.h:376
bool operator>(const Int_vector &op1, const Int_vector &op2)
Test lexicographic ordering between vectors.
Definition: l_int_vector.h:1485
double norm1() const
Definition: m_vector_d.impl.h:348
Image operator/(const Image &op1, double op2)
Scale an image in channel space, yielding a new image.
Definition: i_image.h:825
Vector multiply_matrix_and_vector_d_dispatch_(const Matrix &m, const double *v, size_t size)
dispatch for operator*(Matrix, Vector_d). This deals with a circular dependency between matrix...
Definition: m_vector_d.cpp:97
bool operator!=(const Int_matrix &op1, const Int_matrix::Impl_type &op2)
Test for any difference between two matrices.
Definition: l_int_matrix.h:1274
Vector_d & operator=(const Vector_d &other)
assignment
Definition: m_vector_d.impl.h:267
bool operator==(const Int_matrix &op1, const Int_matrix::Impl_type &op2)
Test for exact equality between two matrices.
Definition: l_int_matrix.cpp:218
Vector create_gauss_random_vector(int length)
Construct a vector with values drawn from a standard Gaussian distribution (mean 0, variance 1);.
Definition: m_vector.cpp:390
Vector3 create_random_vector3()
Definition: m_vector_d.h:341
double norm1(const Vector &op)
Compute L1-norm of vector.
Definition: m_vector.h:2020
Vector_d< D > create_unit_vector(size_t d)
Definition: m_vector_d.impl.h:606
Definition: g_quaternion.h:37
double norm2(const Int_vector &op1)
Compute l2-norm of vector.
Definition: l_int_vector.h:1558
Vector_d(Iterator begin)
Fill constructor.
Definition: m_vector_d.h:88
void set_y(double yv)
Changes the second element of a vector (if it exists).
Definition: m_vector_d.impl.h:196
long int dot(const Int_vector &op1, const Int_vector &op2)
Returns dot product of this and op2.
Definition: l_int_vector.h:1532
for m
Definition: APPgetLargeConnectedEdges.m:64
D
Definition: APPgetLargeConnectedEdges.m:106
Vector_d< D > & negate()
Definition: m_vector_d.impl.h:390
Vector_d< 2 > Vector2
Definition: gr_opengl.h:35
Gsl_Vector operator*(double scalar, const Gsl_Vector &vector)
multiply scalar and vector, scalar written on the left side
Definition: gsl_vector.h:661
double magnitude_squared() const
return the squared l2-norm of this vector
Definition: m_vector_d.impl.h:362