diff --git a/Eigen/src/Core/BandMatrix.h b/Eigen/src/Core/BandMatrix.h index 902b9a826..aaf907593 100644 --- a/Eigen/src/Core/BandMatrix.h +++ b/Eigen/src/Core/BandMatrix.h @@ -78,7 +78,9 @@ class BandMatrix : public MultiplierBase col(int i) + { + int j = i - (cols() - supers() + 1); + int start = std::max(0,subs() - i + 1); + return Block(m_data, start, i, m_data.rows() - (j<0 ? start : j), 1); + } + /** \returns a vector expression of the main diagonal */ inline Block diagonal() { return Block(m_data,supers(),0,1,std::min(rows(),cols())); } @@ -114,31 +124,32 @@ class BandMatrix : public MultiplierBase inline typename DiagonalIntReturnType::Type diagonal() { - return typename DiagonalIntReturnType::Type(m_data, supers()-Index, ei_abs(Index), 1, diagonalLength(Index)); + return typename DiagonalIntReturnType::Type(m_data, supers()-Index, std::max(0,Index), 1, diagonalLength(Index)); } /** \returns a vector expression of the \a Index -th sub or super diagonal */ template inline const typename DiagonalIntReturnType::Type diagonal() const { - return typename DiagonalIntReturnType::Type(m_data, supers()-Index, ei_abs(Index), 1, diagonalLength(Index)); + return typename DiagonalIntReturnType::Type(m_data, supers()-Index, std::max(0,Index), 1, diagonalLength(Index)); } /** \returns a vector expression of the \a i -th sub or super diagonal */ inline Block diagonal(int i) { ei_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers())); - return Block(m_data, supers()-i, ei_abs(i), 1, diagonalLength(i)); + return Block(m_data, supers()-i, std::max(0,i), 1, diagonalLength(i)); } /** \returns a vector expression of the \a i -th sub or super diagonal */ inline const Block diagonal(int i) const { ei_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers())); - return Block(m_data, supers()-i, ei_abs(i), 1, diagonalLength(i)); + return Block(m_data, supers()-i, std::max(0,i), 1, diagonalLength(i)); } PlainMatrixType toDense() const { + std::cerr << m_data << "\n\n"; PlainMatrixType res(rows(),cols()); res.setZero(); res.diagonal() = diagonal();