mirror of
https://github.com/boostorg/ublas.git
synced 2026-02-23 16:12:09 +00:00
- fixed bug in triangular_matrix::resize and hermitian_matrix::resize
by adding new matrix_resize_preserve specialization for those types
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
#define BOOST_UBLAS_HERMITIAN_H
|
||||
|
||||
#include <boost/numeric/ublas/matrix.hpp>
|
||||
#include <boost/numeric/ublas/triangular.hpp> // for resize_preserve
|
||||
#include <boost/numeric/ublas/detail/temporary.hpp>
|
||||
|
||||
// Iterators based on ideas of Jeremy Siek
|
||||
@@ -317,7 +318,7 @@ namespace boost { namespace numeric { namespace ublas {
|
||||
void resize (size_type size, bool preserve = true) {
|
||||
if (preserve) {
|
||||
self_type temporary (size, size);
|
||||
detail::matrix_resize_preserve<layout_type> (*this, temporary);
|
||||
detail::matrix_resize_preserve<layout_type, triangular_type> (*this, temporary);
|
||||
}
|
||||
else {
|
||||
data ().resize (triangular_type::packed_size (layout_type (), size, size));
|
||||
|
||||
@@ -25,6 +25,42 @@
|
||||
|
||||
namespace boost { namespace numeric { namespace ublas {
|
||||
|
||||
namespace detail {
|
||||
using namespace boost::numeric::ublas;
|
||||
|
||||
// Matrix resizing algorithm
|
||||
template <class L, class T, class M>
|
||||
BOOST_UBLAS_INLINE
|
||||
void matrix_resize_preserve (M& m, M& temporary) {
|
||||
typedef L layout_type;
|
||||
typedef T triangular_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, msize1);
|
||||
const size_type size2_min = (std::min) (size2, msize2);
|
||||
// Order for major and minor sizes
|
||||
const size_type major_size = layout_type::size_M (size1_min, size2_min);
|
||||
const size_type minor_size = layout_type::size_m (size1_min, size2_min);
|
||||
// Indexing copy over major
|
||||
for (size_type major = 0; major != major_size; ++major) {
|
||||
for (size_type minor = 0; minor != minor_size; ++minor) {
|
||||
// find indexes - use invertability of element_ functions
|
||||
const size_type i1 = layout_type::index_M(major, minor);
|
||||
const size_type i2 = layout_type::index_m(major, minor);
|
||||
if ( triangular_type::other(i1,i2) ) {
|
||||
temporary.data () [triangular_type::element (layout_type (), i1, size1, i2, size2)] =
|
||||
m.data() [triangular_type::element (layout_type (), i1, msize1, i2, msize2)];
|
||||
}
|
||||
}
|
||||
}
|
||||
m.assign_temporary (temporary);
|
||||
}
|
||||
}
|
||||
|
||||
// Array based triangular matrix class
|
||||
template<class T, class TRI, class L, class A>
|
||||
class triangular_matrix:
|
||||
@@ -104,7 +140,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);
|
||||
detail::matrix_resize_preserve<layout_type> (*this, temporary);
|
||||
detail::matrix_resize_preserve<layout_type, triangular_type> (*this, temporary);
|
||||
}
|
||||
else {
|
||||
data ().resize (triangular_type::packed_size (layout_type (), size1, size2));
|
||||
|
||||
Reference in New Issue
Block a user