2
0
mirror of https://github.com/boostorg/ublas.git synced 2026-02-23 16:12:09 +00:00

Compiles using matrix_resize_preserve

This commit is contained in:
Michael Stevens
2005-01-31 15:48:29 +00:00
parent 33288396d1
commit 625095cd4f
5 changed files with 36 additions and 48 deletions

View File

@@ -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<layout_type> (*this, temporary, size_, size_);
assign_temporary (temporary);
detail::matrix_resize_preserve<layout_type> (*this, temporary);
}
else
else {
data ().resize ((std::max) (size1, size2) * (lower + 1 + upper));
size1_ = size1;
size2_ = size2;
lower_ = lower;
upper_ = upper;
}
}
BOOST_UBLAS_INLINE

View File

@@ -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<layout_type> (*this, temporary, size_, size_);
assign_temporary (temporary);
self_type temporary (size, size);
detail::matrix_resize_preserve<layout_type> (*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) {

View File

@@ -31,12 +31,16 @@ namespace boost { namespace numeric { namespace ublas {
// Matrix resizing algorithm
template <class L, class M>
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<layout_type> (*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<layout_type> (*this, temporary);
}
else {
data ().resize (layout_type::storage_size (size1, size2));

View File

@@ -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<triangular_type> (*this, temporary, size_, size_);
assign_temporary (temporary);
self_type temporary (size, size);
detail::matrix_resize_preserve<layout_type> (*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) {

View File

@@ -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<orienation_type> (*this, temporary, size1_, size2_);
assign_temporary (temporary);
self_type temporary (size1, size2);
detail::matrix_resize_preserve<layout_type> (*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) {