⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix_assign.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
📖 第 1 页 / 共 5 页
字号:
                diff2 -= size2;            }            size2 = (std::min) (- diff2, it2_size);            if (size2 > 0) {                it2_size -= size2;                if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {                    while (-- size2 >= 0) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION                        typename M::iterator1 it1 (it2.begin ());                        typename M::iterator1 it1_end (it2.end ());#else                        typename M::iterator1 it1 (begin (it2, iterator2_tag ()));                        typename M::iterator1 it1_end (end (it2, iterator2_tag ()));#endif                        difference_type size1 (it1_end - it1);                        while (-- size1 >= 0)                            functor1_type::apply (*it1, value_type (0)), ++ it1;                        ++ it2;                    }                } else {                    it2 += size2;                }                diff2 += size2;            }        }        difference_type size2 ((std::min) (it2_size, it2e_size));        it2_size -= size2;        it2e_size -= size2;        while (-- size2 >= 0) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION            typename M::iterator1 it1 (it2.begin ());            typename M::iterator1 it1_end (it2.end ());            typename E::const_iterator1 it1e (it2e.begin ());            typename E::const_iterator1 it1e_end (it2e.end ());#else            typename M::iterator1 it1 (begin (it2, iterator2_tag ()));            typename M::iterator1 it1_end (end (it2, iterator2_tag ()));            typename E::const_iterator1 it1e (begin (it2e, iterator2_tag ()));            typename E::const_iterator1 it1e_end (end (it2e, iterator2_tag ()));#endif            difference_type it1_size (it1_end - it1);            difference_type it1e_size (it1e_end - it1e);            difference_type diff1 (0);            if (it1_size > 0 && it1e_size > 0) {                diff1 = it1.index1 () - it1e.index1 ();                difference_type size1 = (std::min) (diff1, it1e_size);                if (size1 > 0) {                    it1e += size1;                    it1e_size -= size1;                    diff1 -= size1;                }                size1 = (std::min) (- diff1, it1_size);                if (size1 > 0) {                    it1_size -= size1;                    if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {                        while (-- size1 >= 0)                            functor1_type::apply (*it1, value_type (0)), ++ it1;                    } else {                        it1 += size1;                    }                    diff1 += size1;                }            }            difference_type size1 ((std::min) (it1_size, it1e_size));            it1_size -= size1;            it1e_size -= size1;            while (-- size1 >= 0)                functor1_type::apply (*it1, *it1e), ++ it1, ++ it1e;            size1 = it1_size;            if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {                while (-- size1 >= 0)                    functor1_type::apply (*it1, value_type (0)), ++ it1;            } else {                it1 += size1;            }            ++ it2, ++ it2e;        }        size2 = it2_size;        if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {            while (-- size2 >= 0) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION                typename M::iterator1 it1 (it2.begin ());                typename M::iterator1 it1_end (it2.end ());#else                typename M::iterator1 it1 (begin (it2, iterator2_tag ()));                typename M::iterator1 it1_end (end (it2, iterator2_tag ()));#endif                difference_type size1 (it1_end - it1);                while (-- size1 >= 0)                    functor1_type::apply (*it1, value_type (0)), ++ it1;                ++ it2;            }        } else {            it2 += size2;        }#if BOOST_UBLAS_TYPE_CHECK        if (! disable_type_check<bool>::value)            BOOST_UBLAS_CHECK (equals (m, cm), external_logic ());#endif    }    // Sparse row major case    template<class VT, class M, class E>    // This function seems to be big. So we do not let the compiler inline it.    // BOOST_UBLAS_INLINE    void matrix_assign (scalar_assign<BOOST_UBLAS_TYPENAME M::reference, VT>, full, M &m, const matrix_expression<E> &e, sparse_tag, row_major_tag) {        BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ());        BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ());        typedef typename M::value_type value_type;#if BOOST_UBLAS_TYPE_CHECK        // DEPRECATED Sparse type has no numeric constraints#endif        m.clear ();        typename E::const_iterator1 it1e (e ().begin1 ());        typename E::const_iterator1 it1e_end (e ().end1 ());        while (it1e != it1e_end) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION            typename E::const_iterator2 it2e (it1e.begin ());            typename E::const_iterator2 it2e_end (it1e.end ());#else            typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ()));            typename E::const_iterator2 it2e_end (end (it1e, iterator1_tag ()));#endif            while (it2e != it2e_end) {                value_type t (*it2e);                if (t != value_type (0))                    m.insert (it2e.index1 (), it2e.index2 (), t);                ++ it2e;            }            ++ it1e;        }    }    // Sparse column major case    template<class VT, class M, class E>    // This function seems to be big. So we do not let the compiler inline it.    // BOOST_UBLAS_INLINE    void matrix_assign (scalar_assign<BOOST_UBLAS_TYPENAME M::reference, VT>, full, M &m, const matrix_expression<E> &e, sparse_tag, column_major_tag) {        BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ());        BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ());        typedef typename M::value_type value_type;#if BOOST_UBLAS_TYPE_CHECK        // DEPRECATED Sparse type has no numeric constraints#endif        m.clear ();        typename E::const_iterator2 it2e (e ().begin2 ());        typename E::const_iterator2 it2e_end (e ().end2 ());        while (it2e != it2e_end) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION            typename E::const_iterator1 it1e (it2e.begin ());            typename E::const_iterator1 it1e_end (it2e.end ());#else            typename E::const_iterator1 it1e (begin (it2e, iterator2_tag ()));            typename E::const_iterator1 it1e_end (end (it2e, iterator2_tag ()));#endif            while (it1e != it1e_end) {                value_type t (*it1e);                if (t != value_type (0))                    m.insert (it1e.index1 (), it1e.index2 (), t);                ++ it1e;            }            ++ it2e;        }    }    // Sparse proxy row major case    template<class F1, class F2, class M, class E>    // This function seems to be big. So we do not let the compiler inline it.    // BOOST_UBLAS_INLINE    void matrix_assign (F1, F2, M &m, const matrix_expression<E> &e, sparse_proxy_tag, row_major_tag) {        BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ());        BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ());        typedef F1 functor1_type;        typedef F2 functor2_type;        typedef typename M::size_type size_type;        typedef typename M::difference_type difference_type;        typedef typename M::value_type value_type;#if BOOST_UBLAS_TYPE_CHECK        matrix<value_type, row_major> cm (m.size1 (), m.size2 ());#ifndef BOOST_UBLAS_NO_ELEMENT_PROXIES        indexing_matrix_assign (scalar_assign<typename matrix<value_type, row_major>::reference, value_type> (), cm, m, row_major_tag ());        indexing_matrix_assign (functor1_type::template make_debug_functor<typename matrix<value_type, row_major>::reference, value_type> (), cm, e, row_major_tag ());#else        indexing_matrix_assign (scalar_assign<value_type&, value_type> (), cm, m, row_major_tag ());        indexing_matrix_assign (functor1_type (), cm, e, row_major_tag ());#endif#endif#ifdef BOOST_UBLAS_NON_CONFORMANT_PROXIES        make_conformant (m, e, row_major_tag (), functor2_type ());#endif        typename M::iterator1 it1 (m.begin1 ());        typename M::iterator1 it1_end (m.end1 ());        typename E::const_iterator1 it1e (e ().begin1 ());        typename E::const_iterator1 it1e_end (e ().end1 ());        while (it1 != it1_end && it1e != it1e_end) {            difference_type compare = it1.index1 () - it1e.index1 ();            if (compare == 0) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION                typename M::iterator2 it2 (it1.begin ());                typename M::iterator2 it2_end (it1.end ());                typename E::const_iterator2 it2e (it1e.begin ());                typename E::const_iterator2 it2e_end (it1e.end ());#else                typename M::iterator2 it2 (begin (it1, iterator1_tag ()));                typename M::iterator2 it2_end (end (it1, iterator1_tag ()));                typename E::const_iterator2 it2e (begin (it1e, iterator1_tag ()));                typename E::const_iterator2 it2e_end (end (it1e, iterator1_tag ()));#endif                if (it2 != it2_end && it2e != it2e_end) {                    size_type it2_index = it2.index2 (), it2e_index = it2e.index2 ();                    while (true) {                        difference_type compare = it2_index - it2e_index;                        if (compare == 0) {                            functor1_type::apply (*it2, *it2e);                            ++ it2, ++ it2e;                            if (it2 != it2_end && it2e != it2e_end) {                                it2_index = it2.index2 ();                                it2e_index = it2e.index2 ();                            } else                                break;                        } else if (compare < 0) {                            if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {                                functor1_type::apply (*it2, value_type (0));                                ++ it2;                            } else                                increment (it2, it2_end, - compare);                            if (it2 != it2_end)                                it2_index = it2.index2 ();                            else                                break;                        } else if (compare > 0) {                            increment (it2e, it2e_end, compare);                            if (it2e != it2e_end)                                it2e_index = it2e.index2 ();                            else                                break;                        }                    }                }                if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {                    while (it2 != it2_end) {                        functor1_type::apply (*it2, value_type (0));                        ++ it2;                    }                } else {                    it2 = it2_end;                }                ++ it1, ++ it1e;            } else if (compare < 0) {                if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION                    typename M::iterator2 it2 (it1.begin ());                    typename M::iterator2 it2_end (it1.end ());#else                    typename M::iterator2 it2 (begin (it1, iterator1_tag ()));                    typename M::iterator2 it2_end (end (it1, iterator1_tag ()));#endif                    while (it2 != it2_end) {                        functor1_type::apply (*it2, value_type (0));                        ++ it2;                    }                    ++ it1;                } else {                    increment (it1, it1_end, - compare);                }            } else if (compare > 0) {                increment (it1e, it1e_end, compare);            }        }        if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {            while (it1 != it1_end) {#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION                typename M::iterator2 it2 (it1.begin ());                typename M::iterator2 it2_end (it1.end ());#else                typename M::iterator2 it2 (begin (it1, iterator1_tag ()));                typename M::iterator2 it2_end (end (it1, iterator1_tag ()));#endif                while (it2 != it2_end) {                    functor1_type::apply (*it2, value_type (0));                    ++ it2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -