📄 functional.hpp
字号:
t += e () (i);
return t;
}
// Dense case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (difference_type size, I it) const {
result_type t = result_type ();
while (-- size >= 0)
t += *it, ++ it;
return t;
}
// Sparse case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (I it, const I &it_end) const {
result_type t = result_type ();
while (it != it_end)
t += *it, ++ it;
return t;
}
};
// Unary returning real scalar
template<class T>
struct vector_scalar_real_unary_functor {
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef T value_type;
typedef typename type_traits<T>::real_type real_type;
typedef real_type result_type;
};
template<class T>
struct vector_norm_1:
public vector_scalar_real_unary_functor<T> {
typedef typename vector_scalar_real_unary_functor<T>::size_type size_type;
typedef typename vector_scalar_real_unary_functor<T>::difference_type difference_type;
typedef typename vector_scalar_real_unary_functor<T>::value_type value_type;
typedef typename vector_scalar_real_unary_functor<T>::real_type real_type;
typedef typename vector_scalar_real_unary_functor<T>::result_type result_type;
template<class E>
BOOST_UBLAS_INLINE
result_type operator () (const vector_expression<E> &e) const {
real_type t = real_type ();
size_type size (e ().size ());
for (size_type i = 0; i < size; ++ i) {
real_type u (type_traits<value_type>::norm_1 (e () (i)));
t += u;
}
return t;
}
// Dense case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (difference_type size, I it) const {
real_type t = real_type ();
while (-- size >= 0) {
real_type u (type_traits<value_type>::norm_1 (*it));
t += u;
++ it;
}
return t;
}
// Sparse case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (I it, const I &it_end) const {
real_type t = real_type ();
while (it != it_end) {
real_type u (type_traits<value_type>::norm_1 (*it));
t += u;
++ it;
}
return t;
}
};
template<class T>
struct vector_norm_2:
public vector_scalar_real_unary_functor<T> {
typedef typename vector_scalar_real_unary_functor<T>::size_type size_type;
typedef typename vector_scalar_real_unary_functor<T>::difference_type difference_type;
typedef typename vector_scalar_real_unary_functor<T>::value_type value_type;
typedef typename vector_scalar_real_unary_functor<T>::real_type real_type;
typedef typename vector_scalar_real_unary_functor<T>::result_type result_type;
template<class E>
BOOST_UBLAS_INLINE
result_type operator () (const vector_expression<E> &e) const {
#ifndef BOOST_UBLAS_SCALED_NORM
real_type t = real_type ();
size_type size (e ().size ());
for (size_type i = 0; i < size; ++ i) {
real_type u (type_traits<value_type>::norm_2 (e () (i)));
t += u * u;
}
return type_traits<real_type>::sqrt (t);
#else
real_type scale = real_type ();
real_type sum_squares (1);
size_type size (e ().size ());
for (size_type i = 0; i < size; ++ i) {
real_type u (type_traits<value_type>::norm_2 (e () (i)));
if (scale < u) {
real_type v (scale / u);
sum_squares = sum_squares * v * v + real_type (1);
scale = u;
} else {
real_type v (u / scale);
sum_squares += v * v;
}
}
return scale * type_traits<real_type>::sqrt (sum_squares);
#endif
}
// Dense case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (difference_type size, I it) const {
#ifndef BOOST_UBLAS_SCALED_NORM
real_type t = real_type ();
while (-- size >= 0) {
real_type u (type_traits<value_type>::norm_2 (*it));
t += u * u;
++ it;
}
return type_traits<real_type>::sqrt (t);
#else
real_type scale = real_type ();
real_type sum_squares (1);
while (-- size >= 0) {
real_type u (type_traits<value_type>::norm_2 (*it));
if (scale < u) {
real_type v (scale / u);
sum_squares = sum_squares * v * v + real_type (1);
scale = u;
} else {
real_type v (u / scale);
sum_squares += v * v;
}
++ it;
}
return scale * type_traits<real_type>::sqrt (sum_squares);
#endif
}
// Sparse case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (I it, const I &it_end) const {
#ifndef BOOST_UBLAS_SCALED_NORM
real_type t = real_type ();
while (it != it_end) {
real_type u (type_traits<value_type>::norm_2 (*it));
t += u * u;
++ it;
}
return type_traits<real_type>::sqrt (t);
#else
real_type scale = real_type ();
real_type sum_squares (1);
while (it != it_end) {
real_type u (type_traits<value_type>::norm_2 (*it));
if (scale < u) {
real_type v (scale / u);
sum_squares = sum_squares * v * v + real_type (1);
scale = u;
} else {
real_type v (u / scale);
sum_squares += v * v;
}
++ it;
}
return scale * type_traits<real_type>::sqrt (sum_squares);
#endif
}
};
template<class T>
struct vector_norm_inf:
public vector_scalar_real_unary_functor<T> {
typedef typename vector_scalar_real_unary_functor<T>::size_type size_type;
typedef typename vector_scalar_real_unary_functor<T>::difference_type difference_type;
typedef typename vector_scalar_real_unary_functor<T>::value_type value_type;
typedef typename vector_scalar_real_unary_functor<T>::real_type real_type;
typedef typename vector_scalar_real_unary_functor<T>::result_type result_type;
template<class E>
BOOST_UBLAS_INLINE
result_type operator () (const vector_expression<E> &e) const {
real_type t = real_type ();
size_type size (e ().size ());
for (size_type i = 0; i < size; ++ i) {
real_type u (type_traits<value_type>::norm_inf (e () (i)));
if (u > t)
t = u;
}
return t;
}
// Dense case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (difference_type size, I it) const {
real_type t = real_type ();
while (-- size >= 0) {
real_type u (type_traits<value_type>::norm_inf (*it));
if (u > t)
t = u;
++ it;
}
return t;
}
// Sparse case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (I it, const I &it_end) const {
real_type t = real_type ();
while (it != it_end) {
real_type u (type_traits<value_type>::norm_inf (*it));
if (u > t)
t = u;
++ it;
}
return t;
}
};
// Unary returning index
template<class T>
struct vector_scalar_index_unary_functor {
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef T value_type;
typedef typename type_traits<T>::real_type real_type;
typedef difference_type result_type;
};
template<class T>
struct vector_index_norm_inf:
public vector_scalar_index_unary_functor<T> {
typedef typename vector_scalar_index_unary_functor<T>::size_type size_type;
typedef typename vector_scalar_index_unary_functor<T>::difference_type difference_type;
typedef typename vector_scalar_index_unary_functor<T>::value_type value_type;
typedef typename vector_scalar_index_unary_functor<T>::real_type real_type;
typedef typename vector_scalar_index_unary_functor<T>::result_type result_type;
template<class E>
BOOST_UBLAS_INLINE
result_type operator () (const vector_expression<E> &e) const {
// Here we'd better guarantee a valid return value to achieve BLAS compatibility
// result_type i_norm_inf (-1);
result_type i_norm_inf (e ().size () == 0 ? -1 : 0);
real_type t = real_type ();
size_type size (e ().size ());
for (size_type i = 0; i < size; ++ i) {
real_type u (type_traits<value_type>::norm_inf (e () (i)));
if (u > t) {
i_norm_inf = i;
t = u;
}
}
return i_norm_inf;
}
// Dense case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (difference_type size, I it) const {
// Here we'd better guarantee a valid return value to achieve BLAS compatibility
// result_type i_norm_inf (-1);
result_type i_norm_inf (size == 0 ? -1 : 0);
real_type t = real_type ();
while (-- size >= 0) {
real_type u (type_traits<value_type>::norm_inf (*it));
if (u > t) {
i_norm_inf = it.index ();
t = u;
}
++ it;
}
return i_norm_inf;
}
// Sparse case
template<class I>
BOOST_UBLAS_INLINE
result_type operator () (I it, const I &it_end) const {
// Here we'd better guarantee a valid return value to achieve BLAS compatibility
// result_type i_norm_inf (-1);
result_type i_norm_inf (it ().size () == 0 ? -1 : 0);
real_type t = real_type ();
while (it != it_end) {
real_type u (type_traits<value_type>::norm_inf (*it));
if (u > t) {
i_norm_inf = it.index ();
t = u;
}
++ it;
}
return i_norm_inf;
}
};
// Binary returning scalar
template<class T1, class T2, class TR>
struct vector_scalar_binary_functor {
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
typedef TR value_type;
typedef TR result_type;
};
template<class T1, class T2, class TR>
struct vector_inner_prod:
public vector_scalar_binary_functor<T1, T2, TR> {
typedef typename vector_scalar_binary_functor<T1, T2, TR>::size_type size_type ;
typedef typename vector_scalar_binary_functor<T1, T2, TR>::difference_type difference_type;
typedef typename vector_scalar_binary_functor<T1, T2, TR>::value_type value_type;
typedef typename vector_scalar_binary_functor<T1, T2, TR>::result_type result_type;
template<class E1, class E2>
BOOST_UBLAS_INLINE
result_type operator () (const vector_expression<E1> &e1,
const vector_expression<E2> &e2,
concrete_tag) const {
#ifndef BOOST_UBLAS_HAVE_BINDINGS
size_type size (BOOST_UBLAS_SAME (e1 ().size (), e2 ().size ()));
const T1 *data1 = data_const (e1 ());
const T2 *data2 = data_const (e2 ());
size_type s1 = stride (e1 ());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -