aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Householder/HouseholderSequence.h
diff options
context:
space:
mode:
Diffstat (limited to 'Eigen/src/Householder/HouseholderSequence.h')
-rw-r--r--Eigen/src/Householder/HouseholderSequence.h38
1 files changed, 23 insertions, 15 deletions
diff --git a/Eigen/src/Householder/HouseholderSequence.h b/Eigen/src/Householder/HouseholderSequence.h
index 85aa90362..25e962001 100644
--- a/Eigen/src/Householder/HouseholderSequence.h
+++ b/Eigen/src/Householder/HouseholderSequence.h
@@ -73,27 +73,31 @@ template<typename VectorsType, typename CoeffsType> class HouseholderSequence
CoeffsType>::ret> ConjugateReturnType;
HouseholderSequence(const VectorsType& v, const CoeffsType& h, bool trans = false)
- : m_vectors(v), m_coeffs(h), m_trans(trans)
+ : m_vectors(v), m_coeffs(h), m_trans(trans), m_actualVectors(v.diagonalSize())
+ {}
+
+ HouseholderSequence(const VectorsType& v, const CoeffsType& h, bool trans, int actualVectors)
+ : m_vectors(v), m_coeffs(h), m_trans(trans), m_actualVectors(actualVectors)
{}
int rows() const { return m_vectors.rows(); }
int cols() const { return m_vectors.rows(); }
HouseholderSequence transpose() const
- { return HouseholderSequence(m_vectors, m_coeffs, !m_trans); }
+ { return HouseholderSequence(m_vectors, m_coeffs, !m_trans, m_actualVectors); }
ConjugateReturnType conjugate() const
- { return ConjugateReturnType(m_vectors, m_coeffs.conjugate(), m_trans); }
+ { return ConjugateReturnType(m_vectors, m_coeffs.conjugate(), m_trans, m_actualVectors); }
ConjugateReturnType adjoint() const
- { return ConjugateReturnType(m_vectors, m_coeffs.conjugate(), !m_trans); }
+ { return ConjugateReturnType(m_vectors, m_coeffs.conjugate(), !m_trans, m_actualVectors); }
ConjugateReturnType inverse() const { return adjoint(); }
/** \internal */
template<typename DestType> void evalTo(DestType& dst) const
{
- int vecs = std::min(m_vectors.cols(),m_vectors.rows());
+ int vecs = m_actualVectors;
int length = m_vectors.rows();
dst.setIdentity();
Matrix<Scalar,1,DestType::RowsAtCompileTime> temp(dst.rows());
@@ -111,22 +115,22 @@ template<typename VectorsType, typename CoeffsType> class HouseholderSequence
/** \internal */
template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const
{
- int vecs = std::min(m_vectors.cols(),m_vectors.rows()); // number of householder vectors
- int length = m_vectors.rows(); // size of the largest householder vector
- Matrix<Scalar,1,Dest::ColsAtCompileTime> temp(dst.rows());
+ int vecs = m_actualVectors; // number of householder vectors
+ int length = m_vectors.rows(); // size of the largest householder vector
+ Matrix<Scalar,1,Dest::RowsAtCompileTime> temp(dst.rows());
for(int k = 0; k < vecs; ++k)
{
int actual_k = m_trans ? vecs-k-1 : k;
- dst.corner(BottomRight, dst.rows(), length-k)
- .applyHouseholderOnTheRight(m_vectors.col(k).end(length-k-1), m_coeffs.coeff(k), &temp.coeffRef(0));
+ dst.corner(BottomRight, dst.rows(), length-actual_k)
+ .applyHouseholderOnTheRight(m_vectors.col(actual_k).end(length-actual_k-1), m_coeffs.coeff(actual_k), &temp.coeffRef(0));
}
}
/** \internal */
template<typename Dest> inline void applyThisOnTheLeft(Dest& dst) const
{
- int vecs = std::min(m_vectors.cols(),m_vectors.rows()); // number of householder vectors
- int length = m_vectors.rows(); // size of the largest householder vector
+ int vecs = m_actualVectors; // number of householder vectors
+ int length = m_vectors.rows(); // size of the largest householder vector
Matrix<Scalar,1,Dest::ColsAtCompileTime> temp(dst.cols());
for(int k = 0; k < vecs; ++k)
{
@@ -156,9 +160,7 @@ template<typename VectorsType, typename CoeffsType> class HouseholderSequence
typename VectorsType::Nested m_vectors;
typename CoeffsType::Nested m_coeffs;
bool m_trans;
-
-private:
- HouseholderSequence& operator=(const HouseholderSequence&);
+ int m_actualVectors;
};
template<typename VectorsType, typename CoeffsType>
@@ -167,4 +169,10 @@ HouseholderSequence<VectorsType,CoeffsType> householderSequence(const VectorsTyp
return HouseholderSequence<VectorsType,CoeffsType>(v, h, trans);
}
+template<typename VectorsType, typename CoeffsType>
+HouseholderSequence<VectorsType,CoeffsType> householderSequence(const VectorsType& v, const CoeffsType& h, bool trans, int actualVectors)
+{
+ return HouseholderSequence<VectorsType,CoeffsType>(v, h, trans, actualVectors);
+}
+
#endif // EIGEN_HOUSEHOLDER_SEQUENCE_H