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 + -
显示快捷键?