📄 vnl_vector_fixed_ref.h
字号:
void set( T const *ptr ) const { 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) const
{
#if VNL_CONFIG_CHECK_BOUNDS && (!defined NDEBUG)
assert(i<n); // Check the index is valid.
#endif
return data_block()[i];
}
//: Return the i-th element
T& operator[] ( unsigned int i ) const { return data_block()[i]; }
// \sa vnl_vector_ref::non_const
vnl_vector_ref<T> as_ref() { return vnl_vector_ref<T>( n, data_block() ); }
typedef T *iterator;
//: Iterator pointing to start of data
iterator begin() const { return data_block(); }
//: Iterator pointing to element beyond end of data
iterator end() const { return begin()+n; }
//: Replaces elements with index beginning at start, by values of v. O(n).
vnl_vector_fixed_ref const& update (vnl_vector<T> const&, unsigned int start=0) const;
//: Read from text stream
bool read_ascii(vcl_istream& s) const;
void flip() const;
//:
vnl_vector_fixed_ref<T,n> const & operator+=( T s ) const {
base::add( data_block(), s, data_block() ); return *this;
}
//:
vnl_vector_fixed_ref<T,n> const & operator-=( T s ) const {
base::sub( data_block(), s, data_block() ); return *this;
}
//:
vnl_vector_fixed_ref<T,n> const & operator*=( T s ) const {
base::mul( data_block(), s, data_block() ); return *this;
}
//:
vnl_vector_fixed_ref<T,n> const & operator/=( T s ) const {
base::div( data_block(), s, data_block() ); return *this;
}
//:
vnl_vector_fixed_ref<T,n> const & operator+=( const vnl_vector_fixed<T,n>& v ) const {
base::add( data_block(), v.data_block(), data_block() ); return *this;
}
//:
vnl_vector_fixed_ref<T,n> const & operator-=( const vnl_vector_fixed<T,n>& v ) const {
base::sub( data_block(), v.data_block(), data_block() ); return *this;
}
//:
vnl_vector_fixed_ref<T,n> const & operator+=( const vnl_vector<T>& v ) const {
assert( v.size() == n );
base::add( data_block(), v.data_block(), data_block() ); return *this;
}
//:
vnl_vector_fixed_ref<T,n> const & operator-=( const vnl_vector<T>& v ) const {
assert( v.size() == n );
base::sub( data_block(), v.data_block(), data_block() ); return *this;
}
};
// Make the operators below inline because (1) they are small and
// (2) we then have less explicit instantiation trouble.
// --- Vector-scalar operators ----------------------------------------
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator+( const vnl_vector_fixed_ref_const<T,n>& v, T s )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::add( v.data_block(), s, r.data_block() );
return r;
}
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator+( T s, const vnl_vector_fixed_ref_const<T,n>& v )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::add( v.data_block(), s, r.data_block() );
return r;
}
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator-( const vnl_vector_fixed_ref_const<T,n>& v, T s )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::sub( v.data_block(), s, r.data_block() );
return r;
}
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator-( T s, const vnl_vector_fixed_ref_const<T,n>& v )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::sub( s, v.data_block(), r.data_block() );
return r;
}
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator*( const vnl_vector_fixed_ref_const<T,n>& v, T s )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::mul( v.data_block(), s, r.data_block() );
return r;
}
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator*( T s, const vnl_vector_fixed_ref_const<T,n>& v )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::mul( v.data_block(), s, r.data_block() );
return r;
}
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator/( const vnl_vector_fixed_ref_const<T,n>& v, T s )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::div( v.data_block(), s, r.data_block() );
return r;
}
// --- Vector-vector operators ----------------------------------------
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator+( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::add( a.data_block(), b.data_block(), r.data_block() );
return r;
}
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> operator-( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::sub( a.data_block(), b.data_block(), r.data_block() );
return r;
}
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> element_product( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::mul( a.data_block(), b.data_block(), r.data_block() );
return r;
}
template<class T, unsigned int n>
inline vnl_vector_fixed<T,n> element_quotient( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
vnl_vector_fixed<T,n> r;
vnl_vector_fixed<T,n>::div( a.data_block(), b.data_block(), r.data_block() );
return r;
}
template<class T>
vnl_vector_fixed<T,3> vnl_cross_3d(vnl_vector_fixed_ref_const<T,3> const& v1, vnl_vector_fixed_ref_const<T,3> const& v2)
{
vnl_vector_fixed<T,3> result;
result[0] = v1[1] * v2[2] - v1[2] * v2[1];
result[1] = v1[2] * v2[0] - v1[0] * v2[2];
result[2] = v1[0] * v2[1] - v1[1] * v2[0];
return result;
}
// These overloads for the common case of mixing a fixed with a
// non-fixed. Because the operator* are templated, the fixed will not
// be automatically converted to a non-fixed-ref. These do it for you.
template<class T, unsigned int n>
inline vnl_vector<T> operator+( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector<T>& b )
{
return a.as_ref() + b;
}
template<class T, unsigned int n>
inline vnl_vector<T> operator+( const vnl_vector<T>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return a + b.as_ref();
}
template<class T, unsigned int n>
inline vnl_vector<T> operator-( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector<T>& b )
{
return a.as_ref() - b;
}
template<class T, unsigned int n>
inline vnl_vector<T> operator-( const vnl_vector<T>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return a - b.as_ref();
}
template<class T, unsigned n>
inline T dot_product( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return dot_product( a.as_ref(), b.as_ref() );
}
template<class T, unsigned n>
inline T dot_product( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector<T>& b )
{
return dot_product( a.as_ref(), b );
}
template<class T, unsigned n>
inline T dot_product( const vnl_vector<T>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return dot_product( a, b.as_ref() );
}
template<class T, unsigned int m, unsigned int n>
inline vnl_matrix_fixed<T,m,n> outer_product( const vnl_vector_fixed_ref_const<T,m>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
vnl_matrix_fixed<T,m,n> out; // = a.column() * b.row()
for (unsigned int i = 0; i < m; i++)
for (unsigned int j = 0; j < n; j++)
out[i][j] = a[i] * b[j];
return out;
}
template<class T,unsigned int n>
inline vnl_vector_fixed<T,n> vnl_cross_3d( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector<T>& b ) {
return vnl_cross_3d( a.as_ref(), b);
}
template<class T,unsigned int n>
inline vnl_vector_fixed<T,n> vnl_cross_3d( const vnl_vector<T>& a, const vnl_vector_fixed_ref_const<T,n>& b ) {
return vnl_cross_3d( a, b.as_ref());
}
template<class T, unsigned int n>
inline vnl_matrix<T> outer_product( const vnl_vector<T>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return outer_product( a, b.as_ref());
}
template<class T, unsigned int n>
inline vnl_matrix<T> outer_product( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector<T>& b )
{
return outer_product( a.as_ref(), b);
}
template<class T, unsigned n>
inline T angle( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return angle( a.as_ref(), b.as_ref() );
}
template<class T, unsigned n>
inline T angle( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector<T>& b )
{
return angle( a.as_ref(), b );
}
template<class T, unsigned n>
inline T angle( const vnl_vector<T>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return angle( a, b.as_ref() );
}
template<class T, unsigned n>
inline T vnl_vector_ssd( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return vnl_vector_ssd( a.as_ref(), b.as_ref() );
}
template<class T, unsigned n>
inline T vnl_vector_ssd( const vnl_vector_fixed_ref_const<T,n>& a, const vnl_vector<T>& b )
{
return vnl_vector_ssd( a.as_ref(), b );
}
template<class T, unsigned n>
inline T vnl_vector_ssd( const vnl_vector<T>& a, const vnl_vector_fixed_ref_const<T,n>& b )
{
return vnl_vector_ssd( a, b.as_ref() );
}
// --- I/O operators -------------------------------------------------
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline
vcl_ostream& operator<<(vcl_ostream& o,const vnl_vector_fixed_ref_const<T,n>& v)
{
v.print(o);
return o;
}
//: \relates vnl_vector_fixed
template<class T, unsigned int n>
inline
vcl_istream& operator>>(vcl_istream& i, const vnl_vector_fixed_ref<T,n>& v)
{
v.read_ascii(i);
return i;
}
#endif // vnl_vector_fixed_ref_h_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -