📄 matrix_assign.hpp
字号:
while (-- size1 >= 0) {
#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
difference_type size2 (it2_end - it2);
while (-- size2 >= 0)
functor1_type () (*it2, value_type ()), ++ it2;
++ it1;
}
} else {
it1 += size1;
}
diff1 += size1;
}
}
difference_type size1 (std::min (it1_size, it1e_size));
it1_size -= size1;
it1e_size -= size1;
while (-- size1 >= 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
difference_type it2_size (it2_end - it2);
difference_type it2e_size (it2e_end - it2e);
difference_type diff2 (0);
if (it2_size > 0 && it2e_size > 0) {
diff2 = it2.index2 () - it2e.index2 ();
difference_type size2 = std::min (diff2, it2e_size);
if (size2 > 0) {
it2e += size2;
it2e_size -= size2;
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)
functor1_type () (*it2, value_type ()), ++ it2;
} else {
it2 += size2;
}
diff2 += size2;
}
}
difference_type size2 (std::min (it2_size, it2e_size));
it2_size -= size2;
it2e_size -= size2;
while (-- size2 >= 0)
functor1_type () (*it2, *it2e), ++ it2, ++ it2e;
size2 = it2_size;
if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {
while (-- size2 >= 0)
functor1_type () (*it2, value_type ()), ++ it2;
} else {
it2 += size2;
}
++ it1, ++ it1e;
}
size1 = it1_size;
if (boost::is_same<BOOST_UBLAS_TYPENAME functor1_type::assign_category, assign_tag>::value) {
while (-- size1 >= 0) {
#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
difference_type size2 (it2_end - it2);
while (-- size2 >= 0)
functor1_type () (*it2, value_type ()), ++ it2;
++ it1;
}
} else {
it1 += size1;
}
#ifdef BOOST_UBLAS_TYPE_CHECK
if (! disable_type_check)
BOOST_UBLAS_CHECK (equals (m, cm), external_logic ());
#endif
}
// Packed (proxy) column major case
template<class F1, class M, class E, class F2>
// This function seems to be big. So we do not let the compiler inline it.
// BOOST_UBLAS_INLINE
void matrix_assign (F1, M &m, const matrix_expression<E> &e, F2, packed_proxy_tag, column_major_tag) {
BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ());
BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ());
typedef F1 functor1_type;
typedef F2 functor2_type;
typedef typename M::difference_type difference_type;
typedef typename M::value_type value_type;
#ifdef BOOST_UBLAS_TYPE_CHECK
matrix<value_type, column_major> cm (m.size1 (), m.size2 ());
#ifndef BOOST_UBLAS_NO_ELEMENT_PROXIES
indexing_matrix_assign (scalar_assign<typename matrix<value_type, column_major>::reference, value_type> (), cm, m, column_major_tag ());
indexing_matrix_assign (functor1_type::template make_debug_functor<typename matrix<value_type, column_major>::reference, value_type> (), cm, e, column_major_tag ());
#else
indexing_matrix_assign (scalar_assign<value_type, value_type> (), cm, m, column_major_tag ());
indexing_matrix_assign (functor1_type (), cm, e, column_major_tag ());
#endif
#endif
typename M::iterator2 it2 (m.begin2 ());
typename M::iterator2 it2_end (m.end2 ());
typename E::const_iterator2 it2e (e ().begin2 ());
typename E::const_iterator2 it2e_end (e ().end2 ());
difference_type it2_size (it2_end - it2);
difference_type it2e_size (it2e_end - it2e);
difference_type diff2 (0);
if (it2_size > 0 && it2e_size > 0)
diff2 = it2.index2 () - it2e.index2 ();
if (diff2 != 0) {
difference_type size2 = std::min (diff2, it2e_size);
if (size2 > 0) {
it2e += size2;
it2e_size -= size2;
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 () (*it1, value_type ()), ++ 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 () (*it1, value_type ()), ++ 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 () (*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 () (*it1, value_type ()), ++ 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 () (*it1, value_type ()), ++ it1;
++ it2;
}
} else {
it2 += size2;
}
#ifdef BOOST_UBLAS_TYPE_CHECK
if (! disable_type_check)
BOOST_UBLAS_CHECK (equals (m, cm), external_logic ());
#endif
}
// Sparse row major case
template<class F, 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 (F, M &m, const matrix_expression<E> &e, full, sparse_tag, row_major_tag) {
BOOST_UBLAS_CHECK (m.size1 () == e ().size1 (), bad_size ());
BOOST_UBLAS_CHECK (m.size2 () == e ().size2 (), bad_size ());
typedef F functor_type;
typedef typename M::value_type value_type;
#ifdef 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 (functor_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 (functor_type (), cm, e, row_major_tag ());
#endif
#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 ())
m.insert (it2e.index1 (), it2e.index2 (), t);
++ it2e;
}
++ it1e;
}
#ifdef BOOST_UBLAS_TYPE_CHECK
if (! disable_type_check)
BOOST_UBLAS_CHECK (equals (m, cm), external_logic ());
#endif
}
// Sparse column major case
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -