📄 vnl_vector.h
字号:
// This is core/vnl/vnl_vector.h
#ifndef vnl_vector_h_
#define vnl_vector_h_
#ifdef VCL_NEEDS_PRAGMA_INTERFACE
#pragma interface
#endif
//:
// \file
// \author Andrew W. Fitzgibbon
//
// \verbatim
// Modifications
// Comments re-written by Tim Cootes, for his sins.
// Feb.2002 - Peter Vanroose - brief doxygen comment placed on single line
// Mar.2004 - Peter Vanroose - deprecated fixed-size constructors now compile only when VNL_CONFIG_LEGACY_METHODS==1
// \endverbatim
#include <vcl_iosfwd.h>
#include <vnl/vnl_tag.h>
#include <vnl/vnl_c_vector.h>
#include <vnl/vnl_config.h>
#ifndef NDEBUG
# include <vnl/vnl_error.h>
# if VNL_CONFIG_CHECK_BOUNDS
# include <vcl_cassert.h>
# endif
#else
# undef VNL_CONFIG_CHECK_BOUNDS
# define VNL_CONFIG_CHECK_BOUNDS 0
# undef ERROR_CHECKING
#endif
#if VNL_CONFIG_LEGACY_METHODS
# include <vcl_deprecated.h>
#endif
export template <class T> class vnl_vector;
export template <class T> class vnl_matrix;
//----------------------------------------------------------------------
#define v vnl_vector<T>
#define m vnl_matrix<T>
template <class T> T dot_product(v const&, v const&);
template <class T> T inner_product(v const&, v const&);
template <class T> T bracket(v const &, m const &, v const &);
template <class T> T cos_angle(v const&, v const& );
template <class T> double angle(v const&, v const&);
template <class T> m outer_product(v const&, v const&);
template <class T> v operator+(T, v const&);
template <class T> v operator-(T, v const&);
template <class T> v operator*(T, v const&);
// also exists as method: template <class T> v operator*(m const&, v const&);
template <class T> v operator*(v const&, m const&);
template <class T> v element_product(v const&,v const&);
template <class T> v element_quotient(v const&,v const&);
template <class T> T vnl_vector_ssd(v const&, v const&);
template <class T> void swap(v &, v &);
#undef v
#undef m
//----------------------------------------------------------------------
//: Mathematical vector class, templated by type of element.
// The vnl_vector<T> class implements one-dimensional arithmetic
// vectors to be used with the vnl_matrix<T> class. vnl_vector<T>
// has size fixed by constructor time or changed by assignment
// operator.
// For faster, non-mallocing vectors with size known at compile
// time, use vnl_vector_fixed* or vnl_T_n (e.g. vnl_double_3).
//
// NOTE: Vectors are indexed from zero! Thus valid elements are [0,size()-1].
template<class T>
class vnl_vector
{
public:
friend class vnl_matrix<T>;
//: Creates an empty vector. O(1).
vnl_vector() : num_elmts(0) , data(0) {}
//: Creates vector containing n elements.
// Elements are not initialized.
explicit vnl_vector(unsigned len);
//: Creates vector of len elements, all set to v0
vnl_vector(unsigned len, T const& v0);
//: Creates a vector of specified length and initialize first n elements with values. O(n).
vnl_vector(unsigned len, int n, T const values[]);
#if VNL_CONFIG_LEGACY_METHODS // these constructors are deprecated and should not be used
//: Creates a vector of length 2 and initializes with the arguments, px,py.
// Requires that len==2.
// Consider using vnl_vector_fixed<T,2> instead!
// \deprecated
vnl_vector(unsigned len, T const& px, T const& py);
//: Creates a vector of length 3 and initializes with the arguments, px,py,pz.
// Requires that len==3.
// Consider using vnl_vector_fixed<T,3> instead!
// \deprecated
vnl_vector(unsigned len, T const& px, T const& py, T const& pz);
//: Creates a vector of length 4 and initializes with the arguments.
// Requires that len==4.
// Consider using vnl_vector_fixed<T,4> instead!
// \deprecated
vnl_vector(unsigned len, T const& px, T const& py, T const& pz, T const& pw);
#endif
//: Create n element vector and copy data from data_block
vnl_vector(T const* data_block,unsigned int n);
//: Copy constructor
vnl_vector(vnl_vector<T> const&);
#ifndef VXL_DOXYGEN_SHOULD_SKIP_THIS
// <internal>
// These constructors are here so that operator* etc can take
// advantage of the C++ return value optimization.
vnl_vector(vnl_vector<T> const &, vnl_vector<T> const &, vnl_tag_add); // v + v
vnl_vector(vnl_vector<T> const &, vnl_vector<T> const &, vnl_tag_sub); // v - v
vnl_vector(vnl_vector<T> const &, T, vnl_tag_mul); // v * s
vnl_vector(vnl_vector<T> const &, T, vnl_tag_div); // v / s
vnl_vector(vnl_vector<T> const &, T, vnl_tag_add); // v + s
vnl_vector(vnl_vector<T> const &, T, vnl_tag_sub); // v - s
vnl_vector(vnl_matrix<T> const &, vnl_vector<T> const &, vnl_tag_mul); // M * v
vnl_vector(vnl_vector<T> const &, vnl_matrix<T> const &, vnl_tag_mul); // v * M
vnl_vector(vnl_vector<T> &that, vnl_tag_grab)
: num_elmts(that.num_elmts), data(that.data)
{ that.num_elmts=0; that.data=0; } // "*this" now uses "that"'s data.
// </internal>
#endif
//: Destructor
~vnl_vector();
//: Return the length, number of elements, dimension of this vector.
unsigned size() const { return num_elmts; }
//: Put value at given position in vector.
inline void put(unsigned int i, T const&);
//: Get value at element i
inline T get(unsigned int i) const;
//: Set all values to v
void fill(T const& v);
//: Sets elements to ptr[i]
// Note: ptr[i] must be valid for i=0..size()-1
void copy_in(T const * ptr);
//: Copy elements to ptr[i]
// Note: ptr[i] must be valid for i=0..size()-1
void copy_out(T *) const; // from vector to array[].
//: Sets elements to ptr[i]
// Note: ptr[i] must be valid for i=0..size()-1
void set(T const *ptr) { copy_in(ptr); }
//: Return reference to the element at specified index.
// There are assert style boundary checks - #define NDEBUG to turn them off.
T & operator()(unsigned int i)
{
#if VNL_CONFIG_CHECK_BOUNDS
assert(i<size()); // Check the index is valid.
#endif
return data[i];
}
//: Return reference to the element at specified index. No range checking.
// There are assert style boundary checks - #define NDEBUG to turn them off.
T const & operator()(unsigned int i) const
{
#if VNL_CONFIG_CHECK_BOUNDS
assert(i<size()); // Check the index is valid
#endif
return data[i];
}
//: Return reference to the element at specified index. No range checking.
T & operator[](unsigned int i) { return data[i]; }
//: Return reference to the element at specified index. No range checking.
T const & operator[](unsigned int i) const { return data[i]; }
//: Set all elements to value v
vnl_vector<T>& operator=(T const&v) { fill(v); return *this; }
//: Copy operator
vnl_vector<T>& operator=(vnl_vector<T> const& rhs);
//: Add scalar value to all elements
vnl_vector<T>& operator+=(T );
//: Subtract scalar value from all elements
vnl_vector<T>& operator-=(T value) { return *this += (-value); }
//: Multiply all elements by scalar
vnl_vector<T>& operator*=(T );
//: Divide all elements by scalar
vnl_vector<T>& operator/=(T );
//: Add rhs to this and return *this
vnl_vector<T>& operator+=(vnl_vector<T> const& rhs);
//: Subtract rhs from this and return *this
vnl_vector<T>& operator-=(vnl_vector<T> const& rhs);
//: *this = M*(*this) where M is a suitable matrix.
// this is treated as a column vector
vnl_vector<T>& pre_multiply(vnl_matrix<T> const& M);
//: *this = (*this)*M where M is a suitable matrix.
// this is treated as a row vector
vnl_vector<T>& post_multiply(vnl_matrix<T> const& M);
//: *this = (*this)*M where M is a suitable matrix.
// this is treated as a row vector
vnl_vector<T>& operator*=(vnl_matrix<T> const& m) { return this->post_multiply(m); }
//: Unary plus operator
// Return new vector = (*this)
vnl_vector<T> operator+() const { return *this; }
//: Unary minus operator
// Return new vector = -1*(*this)
vnl_vector<T> operator-() const;
vnl_vector<T> operator+(T v) const { return vnl_vector<T>(*this, v, vnl_tag_add()); }
vnl_vector<T> operator-(T v) const { return vnl_vector<T>(*this, v, vnl_tag_sub()); }
vnl_vector<T> operator*(T v) const { return vnl_vector<T>(*this, v, vnl_tag_mul()); }
vnl_vector<T> operator/(T v) const { return vnl_vector<T>(*this, v, vnl_tag_div()); }
vnl_vector<T> operator+(vnl_vector<T> const& v) const { return vnl_vector<T>(*this, v, vnl_tag_add()); }
vnl_vector<T> operator-(vnl_vector<T> const& v) const { return vnl_vector<T>(*this, v, vnl_tag_sub()); }
vnl_vector<T> operator*(vnl_matrix<T> const& M) const { return vnl_vector<T>(*this, M, vnl_tag_mul()); }
//--------------------------------------------------------------------------------
//: Access the contiguous block storing the elements in the vector. O(1).
// data_block()[0] is the first element of the vector
T const* data_block() const { return data; }
//: Access the contiguous block storing the elements in the vector. O(1).
// data_block()[0] is the first element of the vector
T * data_block() { return data; }
//: Type defs for iterators
typedef T element_type;
//: Type defs for iterators
typedef T *iterator;
//: Iterator pointing to start of data
iterator begin() { return data; }
//: Iterator pointing to element beyond end of data
iterator end() { return data+num_elmts; }
//: Const iterator type
typedef T const *const_iterator;
//: Iterator pointing to start of data
const_iterator begin() const { return data; }
//: Iterator pointing to element beyond end of data
const_iterator end() const { return data+num_elmts; }
//: Return a reference to this.
// Useful in code which would prefer not to know if its argument
// is a vector, vector_ref or a vector_fixed. Note that it doesn't
// return a vector_ref, so it's only useful in templates or macros.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -