From 625095cd4fa43e2c831f5a5acd4ff4a503a57094 Mon Sep 17 00:00:00 2001 From: Michael Stevens Date: Mon, 31 Jan 2005 15:48:29 +0000 Subject: [PATCH] Compiles using matrix_resize_preserve --- include/boost/numeric/ublas/banded.hpp | 14 +++++----- include/boost/numeric/ublas/hermitian.hpp | 12 ++++---- include/boost/numeric/ublas/matrix.hpp | 32 +++++++--------------- include/boost/numeric/ublas/symmetric.hpp | 12 ++++---- include/boost/numeric/ublas/triangular.hpp | 14 +++++----- 5 files changed, 36 insertions(+), 48 deletions(-) diff --git a/include/boost/numeric/ublas/banded.hpp b/include/boost/numeric/ublas/banded.hpp index cf451472..90bdee2e 100644 --- a/include/boost/numeric/ublas/banded.hpp +++ b/include/boost/numeric/ublas/banded.hpp @@ -109,17 +109,17 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE void resize (size_type size1, size_type size2, size_type lower = 0, size_type upper = 0, bool preserve = true) { - size1_ = size1; - size2_ = size2; - lower_ = lower; - upper_ = upper; if (preserve) { self_type temporary (size1, size2, lower, upper); - detail::matrix_resize_preserve (*this, temporary, size_, size_); - assign_temporary (temporary); + detail::matrix_resize_preserve (*this, temporary); } - else + else { data ().resize ((std::max) (size1, size2) * (lower + 1 + upper)); + size1_ = size1; + size2_ = size2; + lower_ = lower; + upper_ = upper; + } } BOOST_UBLAS_INLINE diff --git a/include/boost/numeric/ublas/hermitian.hpp b/include/boost/numeric/ublas/hermitian.hpp index f1cd582d..379d6fe8 100644 --- a/include/boost/numeric/ublas/hermitian.hpp +++ b/include/boost/numeric/ublas/hermitian.hpp @@ -316,14 +316,14 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE void resize (size_type size, bool preserve = true) { - size_ = size; if (preserve) { - self_type temporary (size_, size_); - detail::matrix_resize_preserve (*this, temporary, size_, size_); - assign_temporary (temporary); + self_type temporary (size, size); + detail::matrix_resize_preserve (*this, temporary); + } + else { + data ().resize (triangular_type::packed_size (layout_type (), size, size)); + size_ = size; } - else - data ().resize (triangular_type::packed_size (layout_type (), size_, size_)); } BOOST_UBLAS_INLINE void resize (size_type size1, size_type size2, bool preserve = true) { diff --git a/include/boost/numeric/ublas/matrix.hpp b/include/boost/numeric/ublas/matrix.hpp index 00f53965..a56dac1c 100644 --- a/include/boost/numeric/ublas/matrix.hpp +++ b/include/boost/numeric/ublas/matrix.hpp @@ -31,12 +31,16 @@ namespace boost { namespace numeric { namespace ublas { // Matrix resizing algorithm template BOOST_UBLAS_INLINE - void matrix_resize_preserve (M& m, M& temporary, typename M::size_type size1, typename M::size_type size2) { + void matrix_resize_preserve (M& m, M& temporary) { typedef L layout_type; typedef typename M::size_type size_type; + const size_type msize1 (m.size1 ()); // original size + const size_type msize2 (m.size2 ()); + const size_type size1 (temporary.size1 ()); // new size is specified by temporary + const size_type size2 (temporary.size2 ()); // Common elements to preserve - const size_type size1_min = (std::min) (size1, m.size1_); - const size_type size2_min = (std::min) (size2, m.size2_); + const size_type size1_min = (std::min) (size1, msize1); + const size_type size2_min = (std::min) (size2, msize2); // Order loop for i-major and j-minor sizes const size_type i_size = layout_type::size1 (size1_min, size2_min); const size_type j_size = layout_type::size2 (size1_min, size2_min); @@ -45,10 +49,10 @@ namespace boost { namespace numeric { namespace ublas { const size_type element1 = layout_type::element1(i,i_size, j,j_size); const size_type element2 = layout_type::element2(i,i_size, j,j_size); temporary.data () [layout_type::element (element1, size1, element2, size2)] = - m.data() [layout_type::element (element1, m.size1_, element2, m.size2_)]; + m.data() [layout_type::element (element1, msize1, element2, msize2)]; } } - assign_temporary (temporary); + m.assign_temporary (temporary); } } @@ -131,23 +135,7 @@ namespace boost { namespace numeric { namespace ublas { void resize (size_type size1, size_type size2, bool preserve = true) { if (preserve) { self_type temporary (size1, size2); - // FIXME use matrix_resize_preserve on conformant compilers - // detail::matrix_resize_reserve (*this, temporary, size1, size2); - // Common elements to preserve - const size_type size1_min = (std::min) (size1, size1_); - const size_type size2_min = (std::min) (size2, size2_); - // Order loop for i-major and j-minor sizes - const size_type i_size = layout_type::size1 (size1_min, size2_min); - const size_type j_size = layout_type::size2 (size1_min, size2_min); - for (size_type i = 0; i != i_size; ++i) { // indexing copy over major - for (size_type j = 0; j != j_size; ++j) { - const size_type element1 = layout_type::element1(i,i_size, j,j_size); - const size_type element2 = layout_type::element2(i,i_size, j,j_size); - temporary.data () [layout_type::element (element1, size1, element2, size2)] = - data() [layout_type::element (element1, size1_, element2, size2_)]; - } - } - assign_temporary (temporary); + detail::matrix_resize_preserve (*this, temporary); } else { data ().resize (layout_type::storage_size (size1, size2)); diff --git a/include/boost/numeric/ublas/symmetric.hpp b/include/boost/numeric/ublas/symmetric.hpp index 64b283fd..e79da818 100644 --- a/include/boost/numeric/ublas/symmetric.hpp +++ b/include/boost/numeric/ublas/symmetric.hpp @@ -121,14 +121,14 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE void resize (size_type size, bool preserve = true) { - size_ = size; if (preserve) { - self_type temporary (size_, size_); - detail::matrix_resize_preserve (*this, temporary, size_, size_); - assign_temporary (temporary); + self_type temporary (size, size); + detail::matrix_resize_preserve (*this, temporary); + } + else { + data ().resize (triangular_type::packed_size (layout_type (), size, size)); + size_ = size; } - else - data ().resize (triangular_type::packed_size (layout_type (), size_, size_)); } BOOST_UBLAS_INLINE void resize (size_type size1, size_type size2, bool preserve = true) { diff --git a/include/boost/numeric/ublas/triangular.hpp b/include/boost/numeric/ublas/triangular.hpp index 31319711..e2fe810e 100644 --- a/include/boost/numeric/ublas/triangular.hpp +++ b/include/boost/numeric/ublas/triangular.hpp @@ -98,15 +98,15 @@ namespace boost { namespace numeric { namespace ublas { // Resizing BOOST_UBLAS_INLINE void resize (size_type size1, size_type size2, bool preserve = true) { - size1_ = size1; - size2_ = size2; if (preserve) { - self_type temporary (size1_, size2_); - detail::matrix_resize_preserve (*this, temporary, size1_, size2_); - assign_temporary (temporary); + self_type temporary (size1, size2); + detail::matrix_resize_preserve (*this, temporary); + } + else { + data ().resize (triangular_type::packed_size (layout_type (), size1, size2)); + size1_ = size1; + size2_ = size2; } - else - data ().resize (triangular_type::packed_size (layout_type (), size1_, size2_)); } BOOST_UBLAS_INLINE void resize_packed_preserve (size_type size1, size_type size2) {