hermitian.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,677 行 · 第 1/5 页

HPP
1,677
字号
            typename self_type::#endif            iterator1 begin () const {                return (*this) ().find1 (1, 0, it2_);            }            BOOST_UBLAS_INLINE#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION            typename self_type::#endif            iterator1 end () const {                return (*this) ().find1 (1, (*this) ().size1 (), it2_);            }            BOOST_UBLAS_INLINE#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION            typename self_type::#endif            reverse_iterator1 rbegin () const {                return reverse_iterator1 (end ());            }            BOOST_UBLAS_INLINE#ifdef BOOST_UBLAS_MSVC_NESTED_CLASS_RELATION            typename self_type::#endif            reverse_iterator1 rend () const {                return reverse_iterator1 (begin ());            }#endif            // Indices            BOOST_UBLAS_INLINE            size_type index1 () const {                return it1_;            }            BOOST_UBLAS_INLINE            size_type index2 () const {                return it2_;            }            // Assignment            BOOST_UBLAS_INLINE            iterator2 &operator = (const iterator2 &it) {                container_reference<self_type>::assign (&it ());                it1_ = it.it1_;                it2_ = it.it2_;                return *this;            }            // Comparison            BOOST_UBLAS_INLINE            bool operator == (const iterator2 &it) const {                BOOST_UBLAS_CHECK (&(*this) () == &it (), external_logic ());                BOOST_UBLAS_CHECK (it1_ == it.it1_, external_logic ());                return it2_ == it.it2_;            }            BOOST_UBLAS_INLINE            bool operator < (const iterator2 &it) const {                BOOST_UBLAS_CHECK (&(*this) () == &it (), external_logic ());                BOOST_UBLAS_CHECK (it1_ == it.it1_, external_logic ());                return it2_ < it.it2_;            }        private:            size_type it1_;            size_type it2_;            friend class const_iterator2;        };#endif        BOOST_UBLAS_INLINE        iterator2 begin2 () {            return find2 (0, 0, 0);        }        BOOST_UBLAS_INLINE        iterator2 end2 () {            return find2 (0, 0, size_);        }        // Reverse iterators        BOOST_UBLAS_INLINE        const_reverse_iterator1 rbegin1 () const {            return const_reverse_iterator1 (end1 ());        }        BOOST_UBLAS_INLINE        const_reverse_iterator1 rend1 () const {            return const_reverse_iterator1 (begin1 ());        }        BOOST_UBLAS_INLINE        reverse_iterator1 rbegin1 () {            return reverse_iterator1 (end1 ());        }        BOOST_UBLAS_INLINE        reverse_iterator1 rend1 () {            return reverse_iterator1 (begin1 ());        }        BOOST_UBLAS_INLINE        const_reverse_iterator2 rbegin2 () const {            return const_reverse_iterator2 (end2 ());        }        BOOST_UBLAS_INLINE        const_reverse_iterator2 rend2 () const {            return const_reverse_iterator2 (begin2 ());        }        BOOST_UBLAS_INLINE        reverse_iterator2 rbegin2 () {            return reverse_iterator2 (end2 ());        }        BOOST_UBLAS_INLINE        reverse_iterator2 rend2 () {            return reverse_iterator2 (begin2 ());        }    private:        size_type size_;        array_type data_;    };    // Hermitian matrix adaptor class    template<class M, class TRI>    class hermitian_adaptor:        public matrix_expression<hermitian_adaptor<M, TRI> > {        typedef hermitian_adaptor<M, TRI> self_type;        typedef typename M::value_type &true_reference;    public:#ifdef BOOST_UBLAS_ENABLE_PROXY_SHORTCUTS        using matrix_expression<self_type>::operator ();#endif        typedef const M const_matrix_type;        typedef M matrix_type;        typedef TRI triangular_type;        typedef typename M::size_type size_type;        typedef typename M::difference_type difference_type;        typedef typename M::value_type value_type;        typedef typename M::value_type const_reference;#ifndef BOOST_UBLAS_STRICT_HERMITIAN        typedef typename boost::mpl::if_<boost::is_const<M>,                                          typename M::value_type,                                          typename M::reference>::type reference;#else        typedef typename boost::mpl::if_<boost::is_const<M>,                                          typename M::value_type,                                          hermitian_matrix_element<self_type> >::type reference;#endif        typedef typename boost::mpl::if_<boost::is_const<M>,                                          typename M::const_closure_type,                                          typename M::closure_type>::type matrix_closure_type;        typedef const self_type const_closure_type;        typedef self_type closure_type;        // Replaced by _temporary_traits to avoid type requirements on M        //typedef typename M::vector_temporary_type vector_temporary_type;        //typedef typename M::matrix_temporary_type matrix_temporary_type;        typedef typename storage_restrict_traits<typename M::storage_category,                                                 packed_proxy_tag>::storage_category storage_category;        typedef typename M::orientation_category orientation_category;        // Construction and destruction        BOOST_UBLAS_INLINE        hermitian_adaptor (matrix_type &data):            matrix_expression<self_type> (),            data_ (data) {            BOOST_UBLAS_CHECK (data_.size1 () == data_.size2 (), bad_size ());        }        BOOST_UBLAS_INLINE        hermitian_adaptor (const hermitian_adaptor &m):            matrix_expression<self_type> (),            data_ (m.data_) {            BOOST_UBLAS_CHECK (data_.size1 () == data_.size2 (), bad_size ());        }        // Accessors        BOOST_UBLAS_INLINE        size_type size1 () const {            return data_.size1 ();        }        BOOST_UBLAS_INLINE        size_type size2 () const {            return data_.size2 ();        }        // Storage accessors        BOOST_UBLAS_INLINE        const matrix_closure_type &data () const {            return data_;        }        BOOST_UBLAS_INLINE        matrix_closure_type &data () {            return data_;        }        // Element access#ifndef BOOST_UBLAS_PROXY_CONST_MEMBER        BOOST_UBLAS_INLINE        const_reference operator () (size_type i, size_type j) const {            BOOST_UBLAS_CHECK (i < size1 (), bad_index ());            BOOST_UBLAS_CHECK (j < size2 (), bad_index ());            // if (i == j)            //     return type_traits<value_type>::real (data () (i, i));            // else            if (triangular_type::other (i, j))                return data () (i, j);            else                return type_traits<value_type>::conj (data () (j, i));        }        BOOST_UBLAS_INLINE        reference operator () (size_type i, size_type j) {            BOOST_UBLAS_CHECK (i < size1 (), bad_index ());            BOOST_UBLAS_CHECK (j < size2 (), bad_index ());#ifndef BOOST_UBLAS_STRICT_HERMITIAN            if (triangular_type::other (i, j))                return data () (i, j);            else {                external_logic ().raise ();                return conj_ = type_traits<value_type>::conj (data () (j, i));            }#else            if (triangular_type::other (i, j))                return reference (*this, i, j, data () (i, j));            else                return reference (*this, i, j, type_traits<value_type>::conj (data () (j, i)));#endif        }        BOOST_UBLAS_INLINE        true_reference insert_element (size_type i, size_type j, value_type t) {            BOOST_UBLAS_CHECK (i < size1 (), bad_index ());            BOOST_UBLAS_CHECK (j < size2 (), bad_index ());            // if (i == j)            //     data () (i, i) = type_traits<value_type>::real (t);            // else            if (triangular_type::other (i, j))                return data () (i, j) = t;            else                return data () (j, i) = type_traits<value_type>::conj (t);        }#else        BOOST_UBLAS_INLINE        reference operator () (size_type i, size_type j) {            BOOST_UBLAS_CHECK (i < size1 (), bad_index ());            BOOST_UBLAS_CHECK (j < size2 (), bad_index ());#ifndef BOOST_UBLAS_STRICT_HERMITIAN            if (triangular_type::other (i, j))                return data () (i, j);            else {                external_logic ().raise ();                return conj_ = type_traits<value_type>::conj (data () (j, i));            }#else            if (triangular_type::other (i, j))                return reference (*this, i, j, data () (i, j));            else                return reference (*this, i, j, type_traits<value_type>::conj (data () (j, i)));#endif        }        BOOST_UBLAS_INLINE        true_reference insert_element (size_type i, size_type j, value_type t) {            BOOST_UBLAS_CHECK (i < size1 (), bad_index ());            BOOST_UBLAS_CHECK (j < size2 (), bad_index ());            // if (i == j)            //     data () (i, i) = type_traits<value_type>::real (t);            // else            if (triangular_type::other (i, j))                return data () (i, j) = t;            else                return data () (j, i) = type_traits<value_type>::conj (t);        }#endif        // Assignment        BOOST_UBLAS_INLINE        hermitian_adaptor &operator = (const hermitian_adaptor &m) {            matrix_assign<scalar_assign, triangular_type> (*this, m);            return *this;        }        BOOST_UBLAS_INLINE        hermitian_adaptor &assign_temporary (hermitian_adaptor &m) {            *this = m;            return *this;        }        template<class AE>        BOOST_UBLAS_INLINE        hermitian_adaptor &operator = (const matrix_expression<AE> &ae) {            matrix_assign<scalar_assign, triangular_type> (*this, matrix<value_type> (ae));            return *this;        }        template<class AE>        BOOST_UBLAS_INLINE        hermitian_adaptor &assign (const matrix_expression<AE> &ae) {            matrix_assign<scalar_assign, triangular_type> (*this, ae);            return *this;        }        template<class AE>        BOOST_UBLAS_INLINE        hermitian_adaptor& operator += (const matrix_expression<AE> &ae) {            matrix_assign<scalar_assign, triangular_type> (*this, matrix<value_type> (*this + ae));            return *this;        }        template<class AE>        BOOST_UBLAS_INLINE        hermitian_adaptor &plus_assign (const matrix_expression<AE> &ae) {            matrix_assign<scalar_plus_assign, triangular_type> (*this, ae);            return *this;        }        template<class AE>        BOOST_UBLAS_INLINE        hermitian_adaptor& operator -= (const matrix_expression<AE> &ae) {            matrix_assign<scalar_assign, triangular_type> (*this, matrix<value_type> (*this - ae));            return *this;        }        template<class AE>        BOOST_UBLAS_INLINE        hermitian_adaptor &minus_assign (const matrix_expression<AE> &ae) {            matrix_assign<scalar_minus_assign, triangular_type> (*this, ae);            return *this;        }        template<class AT>        BOOST_UBLAS_INLINE        hermitian_adaptor& operator *= (const AT &at) {            // Multiplication is only allowed for real scalars,            // otherwise the resulting matrix isn't hermitian.            // Thanks to Peter Schmitteckert for spotting this.            BOOST_UBLAS_CHECK (type_traits<value_type>::imag (at) == 0, non_real ());            matrix_assign_scalar<scalar_multiplies_assign> (*this, at);            return *this;        }        template<class AT>        BOOST_UBLAS_INLINE        hermitian_adaptor& operator /= (const AT &at) {            // Multiplication is only allowed for real scalars,            // otherwise the resulting matrix isn't hermitian.            // Thanks to Peter Schmitteckert for spotting this.            BOOST_UBLAS_CHECK (type_traits<value_type>::imag (at) == 0, non_real ());

⌨️ 快捷键说明

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