📄 vector_expression.hpp
字号:
// Comparison
BOOST_UBLAS_INLINE
bool operator == (const const_iterator &it) const {
BOOST_UBLAS_CHECK ((*this) ().same_closure (it ()), external_logic ());
// FIXME we shouldn't compare floats
// BOOST_UBLAS_CHECK (it2_ == it.it2_, external_logic ());
return it1_ == it.it1_;
}
BOOST_UBLAS_INLINE
bool operator < (const const_iterator &it) const {
BOOST_UBLAS_CHECK ((*this) ().same_closure (it ()), external_logic ());
// FIXME we shouldn't compare floats
// BOOST_UBLAS_CHECK (it2_ == it.it2_, external_logic ());
return it1_ < it.it1_;
}
private:
const_subiterator1_type it1_;
const_subiterator2_type it2_;
};
#endif
BOOST_UBLAS_INLINE
const_iterator begin () const {
return find (0);
}
BOOST_UBLAS_INLINE
const_iterator end () const {
return find (size ());
}
// Reverse iterator
typedef reverse_iterator_base<const_iterator> const_reverse_iterator;
BOOST_UBLAS_INLINE
const_reverse_iterator rbegin () const {
return const_reverse_iterator (end ());
}
BOOST_UBLAS_INLINE
const_reverse_iterator rend () const {
return const_reverse_iterator (begin ());
}
private:
expression1_closure_type e1_;
expression2_closure_type e2_;
};
template<class E1, class E2, class F>
struct vector_binary_scalar2_traits {
typedef vector_binary_scalar2<E1, E2, F> expression_type; // allow E2 to be builtin type
#ifndef BOOST_UBLAS_SIMPLE_ET_DEBUG
typedef expression_type result_type;
#else
typedef typename E1::vector_temporary_type result_type;
#endif
};
// (v * t) [i] = v [i] * t
template<class E1, class T2>
BOOST_UBLAS_INLINE
typename vector_binary_scalar2_traits<E1, const T2, scalar_multiplies<typename E1::value_type, T2> >::result_type
operator * (const vector_expression<E1> &e1,
const T2 &e2) {
typedef typename vector_binary_scalar2_traits<E1, const T2, scalar_multiplies<typename E1::value_type, T2> >::expression_type expression_type;
return expression_type (e1 (), e2);
}
// (v / t) [i] = v [i] / t
template<class E1, class T2>
BOOST_UBLAS_INLINE
typename vector_binary_scalar2_traits<E1, const T2, scalar_divides<typename E1::value_type, T2> >::result_type
operator / (const vector_expression<E1> &e1,
const T2 &e2) {
typedef typename vector_binary_scalar2_traits<E1, const T2, scalar_divides<typename E1::value_type, T2> >::expression_type expression_type;
return expression_type (e1 (), e2);
}
template<class E, class F>
class vector_scalar_unary:
public scalar_expression<vector_scalar_unary<E, F> > {
typedef E expression_type;
typedef F functor_type;
typedef typename E::const_closure_type expression_closure_type;
typedef typename E::const_iterator::iterator_category iterator_category;
typedef vector_scalar_unary<E, F> self_type;
public:
typedef typename F::size_type size_type;
typedef typename F::difference_type difference_type;
typedef typename F::result_type value_type;
typedef const self_type const_closure_type;
typedef const_closure_type closure_type;
typedef unknown_storage_tag storage_category;
// Construction and destruction
BOOST_UBLAS_INLINE
explicit vector_scalar_unary (const expression_type &e):
e_ (e) {}
private:
// Expression accessors
BOOST_UBLAS_INLINE
const expression_closure_type &expression () const {
return e_;
}
public:
BOOST_UBLAS_INLINE
operator value_type () const {
return evaluate (iterator_category ());
}
private:
// Dense random access specialization
BOOST_UBLAS_INLINE
value_type evaluate (dense_random_access_iterator_tag) const {
#ifdef BOOST_UBLAS_USE_INDEXING
return functor_type::apply (e_);
#elif BOOST_UBLAS_USE_ITERATING
difference_type size = e_.size ();
return functor_type::apply (size, e_.begin ());
#else
difference_type size = e_.size ();
if (size >= BOOST_UBLAS_ITERATOR_THRESHOLD)
return functor_type::apply (size, e_.begin ());
else
return functor_type::apply (e_);
#endif
}
// Packed bidirectional specialization
BOOST_UBLAS_INLINE
value_type evaluate (packed_random_access_iterator_tag) const {
return functor_type::apply (e_.begin (), e_.end ());
}
// Sparse bidirectional specialization
BOOST_UBLAS_INLINE
value_type evaluate (sparse_bidirectional_iterator_tag) const {
return functor_type::apply (e_.begin (), e_.end ());
}
private:
expression_closure_type e_;
};
template<class E, class F>
struct vector_scalar_unary_traits {
typedef vector_scalar_unary<E, F> expression_type;
#if !defined (BOOST_UBLAS_SIMPLE_ET_DEBUG) && defined (BOOST_UBLAS_USE_SCALAR_ET)
// FIXME don't define USE_SCALAR_ET other then for testing
// They do not work for complex types
typedef expression_type result_type;
#else
typedef typename F::result_type result_type;
#endif
};
// sum v = sum (v [i])
template<class E>
BOOST_UBLAS_INLINE
typename vector_scalar_unary_traits<E, vector_sum<typename E::value_type> >::result_type
sum (const vector_expression<E> &e) {
typedef typename vector_scalar_unary_traits<E, vector_sum<typename E::value_type> >::expression_type expression_type;
return expression_type (e ());
}
// real: norm_1 v = sum (abs (v [i]))
// complex: norm_1 v = sum (abs (real (v [i])) + abs (imag (v [i])))
template<class E>
BOOST_UBLAS_INLINE
typename vector_scalar_unary_traits<E, vector_norm_1<typename E::value_type> >::result_type
norm_1 (const vector_expression<E> &e) {
typedef typename vector_scalar_unary_traits<E, vector_norm_1<typename E::value_type> >::expression_type expression_type;
return expression_type (e ());
}
// real: norm_2 v = sqrt (sum (v [i] * v [i]))
// complex: norm_2 v = sqrt (sum (v [i] * conj (v [i])))
template<class E>
BOOST_UBLAS_INLINE
typename vector_scalar_unary_traits<E, vector_norm_2<typename E::value_type> >::result_type
norm_2 (const vector_expression<E> &e) {
typedef typename vector_scalar_unary_traits<E, vector_norm_2<typename E::value_type> >::expression_type expression_type;
return expression_type (e ());
}
// real: norm_inf v = maximum (abs (v [i]))
// complex: norm_inf v = maximum (maximum (abs (real (v [i])), abs (imag (v [i]))))
template<class E>
BOOST_UBLAS_INLINE
typename vector_scalar_unary_traits<E, vector_norm_inf<typename E::value_type> >::result_type
norm_inf (const vector_expression<E> &e) {
typedef typename vector_scalar_unary_traits<E, vector_norm_inf<typename E::value_type> >::expression_type expression_type;
return expression_type (e ());
}
// real: index_norm_inf v = minimum (i: abs (v [i]) == maximum (abs (v [i])))
template<class E>
BOOST_UBLAS_INLINE
typename vector_scalar_unary_traits<E, vector_index_norm_inf<typename E::value_type> >::result_type
index_norm_inf (const vector_expression<E> &e) {
typedef typename vector_scalar_unary_traits<E, vector_index_norm_inf<typename E::value_type> >::expression_type expression_type;
return expression_type (e ());
}
template<class E1, class E2, class F>
class vector_scalar_binary:
public scalar_expression<vector_scalar_binary<E1, E2, F> > {
typedef E1 expression1_type;
typedef E2 expression2_type;
typedef F functor_type;
typedef typename E1::const_closure_type expression1_closure_type;
typedef typename E2::const_closure_type expression2_closure_type;
typedef typename iterator_restrict_traits<typename E1::const_iterator::iterator_category,
typename E2::const_iterator::iterator_category>::iterator_category iterator_category;
typedef vector_scalar_binary<E1, E2, F> self_type;
public:
static const unsigned complexity = 1;
typedef typename F::size_type size_type;
typedef typename F::difference_type difference_type;
typedef typename F::result_type value_type;
typedef const self_type const_closure_type;
typedef const_closure_type closure_type;
typedef unknown_storage_tag storage_category;
// Construction and destruction
BOOST_UBLAS_INLINE
vector_scalar_binary (const expression1_type &e1, const expression2_type &e2):
e1_ (e1), e2_ (e2) {}
private:
// Accessors
BOOST_UBLAS_INLINE
const expression1_closure_type &expression1 () const {
return e1_;
}
BOOST_UBLAS_INLINE
const expression2_closure_type &expression2 () const {
return e2_;
}
public:
BOOST_UBLAS_INLINE
operator value_type () const {
return evaluate (iterator_category ());
}
private:
// Dense random access specialization
BOOST_UBLAS_INLINE
value_type evaluate (dense_random_access_iterator_tag) const {
#ifdef BOOST_UBLAS_USE_INDEXING
return functor_type::apply (e1_, e2_);
#elif BOOST_UBLAS_USE_ITERATING
difference_type size = BOOST_UBLAS_SAME (e1_.size (), e2_.size ());
return functor_type::apply (size, e1_.begin (), e2_.begin ());
#else
difference_type size = BOOST_UBLAS_SAME (e1_.size (), e2_.size ());
if (size >= BOOST_UBLAS_ITERATOR_THRESHOLD)
return functor_type::apply (size, e1_.begin (), e2_.begin ());
else
return functor_type::apply (e1_, e2_);
#endif
}
// Packed bidirectional specialization
BOOST_UBLAS_INLINE
value_type evaluate (packed_random_access_iterator_tag) const {
return functor_type::apply (e1_.begin (), e1_.end (), e2_.begin (), e2_.end ());
}
// Sparse bidirectional specialization
BOOST_UBLAS_INLINE
value_type evaluate (sparse_bidirectional_iterator_tag) const {
return functor_type::apply (e1_.begin (), e1_.end (), e2_.begin (), e2_.end (), sparse_bidirectional_iterator_tag ());
}
private:
expression1_closure_type e1_;
expression2_closure_type e2_;
};
template<class E1, class E2, class F>
struct vector_scalar_binary_traits {
typedef vector_scalar_binary<E1, E2, F> expression_type;
#if !defined (BOOST_UBLAS_SIMPLE_ET_DEBUG) && defined (BOOST_UBLAS_USE_SCALAR_ET)
// FIXME don't define USE_SCALAR_ET other then for testing
// They do not work for complex types
typedef expression_type result_type;
#else
typedef typename F::result_type result_type;
#endif
};
// inner_prod (v1, v2) = sum (v1 [i] * v2 [i])
template<class E1, class E2>
BOOST_UBLAS_INLINE
typename vector_scalar_binary_traits<E1, E2, vector_inner_prod<typename E1::value_type,
typename E2::value_type,
typename promote_traits<typename E1::value_type,
typename E2::value_type>::promote_type> >::result_type
inner_prod (const vector_expression<E1> &e1,
const vector_expression<E2> &e2) {
typedef typename vector_scalar_binary_traits<E1, E2, vector_inner_prod<typename E1::value_type,
typename E2::value_type,
typename promote_traits<typename E1::value_type,
typename E2::value_type>::promote_type> >::expression_type expression_type;
return expression_type (e1 (), e2 ());
}
template<class E1, class E2>
BOOST_UBLAS_INLINE
typename vector_scalar_binary_traits<E1, E2, vector_inner_prod<typename E1::value_type,
typename E2::value_type,
typename type_traits<typename promote_traits<typename E1::value_type,
typename E2::value_type>::promote_type>::precision_type> >::result_type
prec_inner_prod (const vector_expression<E1> &e1,
const vector_expression<E2> &e2) {
typedef typename vector_scalar_binary_traits<E1, E2, vector_inner_prod<typename E1::value_type,
typename E2::value_type,
typename type_traits<typename promote_traits<typename E1::value_type,
typename E2::value_type>::promote_type>::precision_type> >::expression_type expression_type;
return expression_type (e1 (), e2 ());
}
}}}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -