functional.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,692 行 · 第 1/5 页
HPP
1,692 行
typedef typename vector_scalar_unary_functor<V>::result_type result_type; template<class E> static BOOST_UBLAS_INLINE result_type apply (const vector_expression<E> &e) { result_type t = result_type (0); typedef typename E::size_type vector_size_type; vector_size_type size (e ().size ()); for (vector_size_type i = 0; i < size; ++ i) t += e () (i); return t; } // Dense case template<class D, class I> static BOOST_UBLAS_INLINE result_type apply (D size, I it) { result_type t = result_type (0); while (-- size >= 0) t += *it, ++ it; return t; } // Sparse case template<class I> static BOOST_UBLAS_INLINE result_type apply (I it, const I &it_end) { result_type t = result_type (0); while (it != it_end) t += *it, ++ it; return t; } }; // Unary returning real scalar template<class V> struct vector_scalar_real_unary_functor { typedef typename V::value_type value_type; typedef typename type_traits<value_type>::real_type real_type; typedef real_type result_type; }; template<class V> struct vector_norm_1: public vector_scalar_real_unary_functor<V> { typedef typename vector_scalar_real_unary_functor<V>::value_type value_type; typedef typename vector_scalar_real_unary_functor<V>::real_type real_type; typedef typename vector_scalar_real_unary_functor<V>::result_type result_type; template<class E> static BOOST_UBLAS_INLINE result_type apply (const vector_expression<E> &e) { real_type t = real_type (); typedef typename E::size_type vector_size_type; vector_size_type size (e ().size ()); for (vector_size_type i = 0; i < size; ++ i) { real_type u (type_traits<value_type>::type_abs (e () (i))); t += u; } return t; } // Dense case template<class D, class I> static BOOST_UBLAS_INLINE result_type apply (D size, I it) { 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> static BOOST_UBLAS_INLINE result_type apply (I it, const I &it_end) { 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 V> struct vector_norm_2: public vector_scalar_real_unary_functor<V> { typedef typename vector_scalar_real_unary_functor<V>::value_type value_type; typedef typename vector_scalar_real_unary_functor<V>::real_type real_type; typedef typename vector_scalar_real_unary_functor<V>::result_type result_type; template<class E> static BOOST_UBLAS_INLINE result_type apply (const vector_expression<E> &e) {#ifndef BOOST_UBLAS_SCALED_NORM real_type t = real_type (); typedef typename E::size_type vector_size_type; vector_size_type size (e ().size ()); for (vector_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>::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 ( real_type () /* zero */ == u ) continue; 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>::type_sqrt (sum_squares);#endif } // Dense case template<class D, class I> static BOOST_UBLAS_INLINE result_type apply (D size, I it) {#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>::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>::type_sqrt (sum_squares);#endif } // Sparse case template<class I> static BOOST_UBLAS_INLINE result_type apply (I it, const I &it_end) {#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>::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>::type_sqrt (sum_squares);#endif } }; template<class V> struct vector_norm_inf: public vector_scalar_real_unary_functor<V> { typedef typename vector_scalar_real_unary_functor<V>::value_type value_type; typedef typename vector_scalar_real_unary_functor<V>::real_type real_type; typedef typename vector_scalar_real_unary_functor<V>::result_type result_type; template<class E> static BOOST_UBLAS_INLINE result_type apply (const vector_expression<E> &e) { real_type t = real_type (); typedef typename E::size_type vector_size_type; vector_size_type size (e ().size ()); for (vector_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 D, class I> static BOOST_UBLAS_INLINE result_type apply (D size, I it) { 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> static BOOST_UBLAS_INLINE result_type apply (I it, const I &it_end) { 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 V> struct vector_scalar_index_unary_functor { typedef typename V::value_type value_type; typedef typename type_traits<value_type>::real_type real_type; typedef typename V::size_type result_type; }; template<class V> struct vector_index_norm_inf: public vector_scalar_index_unary_functor<V> { typedef typename vector_scalar_index_unary_functor<V>::value_type value_type; typedef typename vector_scalar_index_unary_functor<V>::real_type real_type; typedef typename vector_scalar_index_unary_functor<V>::result_type result_type; template<class E> static BOOST_UBLAS_INLINE result_type apply (const vector_expression<E> &e) { // ISSUE For CBLAS compatibility return 0 index in empty case result_type i_norm_inf (0); real_type t = real_type (); typedef typename E::size_type vector_size_type; vector_size_type size (e ().size ()); for (vector_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 D, class I> static BOOST_UBLAS_INLINE result_type apply (D size, I it) { // ISSUE For CBLAS compatibility return 0 index in empty case result_type i_norm_inf (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> static BOOST_UBLAS_INLINE result_type apply (I it, const I &it_end) { // ISSUE For CBLAS compatibility return 0 index in empty case result_type i_norm_inf (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 V1, class V2, class TV> struct vector_scalar_binary_functor { typedef TV value_type; typedef TV result_type; }; template<class V1, class V2, class TV> struct vector_inner_prod: public vector_scalar_binary_functor<V1, V2, TV> { typedef typename vector_scalar_binary_functor<V1, V2, TV>::value_type value_type; typedef typename vector_scalar_binary_functor<V1, V2, TV>::result_type result_type; template<class C1, class C2> static BOOST_UBLAS_INLINE result_type apply (const vector_container<C1> &c1, const vector_container<C2> &c2) {#ifdef BOOST_UBLAS_USE_SIMD using namespace raw; typedef typename C1::size_type vector_size_type; vector_size_type size (BOOST_UBLAS_SAME (c1 ().size (), c2 ().size ())); const typename V1::value_type *data1 = data_const (c1 ()); const typename V1::value_type *data2 = data_const (c2 ()); vector_size_type s1 = stride (c1 ()); vector_size_type s2 = stride (c2 ()); result_type t = result_type (0); if (s1 == 1 && s2 == 1) { for (vector_size_type i = 0; i < size; ++ i) t += data1 [i] * data2 [i]; } else if (s2 == 1) { for (vector_size_type i = 0, i1 = 0; i < size; ++ i, i1 += s1) t += data1 [i1] * data2 [i]; } else if (s1 == 1) { for (vector_size_type i = 0, i2 = 0; i < size; ++ i, i2 += s2) t += data1 [i] * data2 [i2]; } else { for (vector_size_type i = 0, i1 = 0, i2 = 0; i < size; ++ i, i1 += s1, i2 += s2) t += data1 [i1] * data2 [i2]; } return t;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?