11 #ifndef EIGEN_HOUSEHOLDER_SEQUENCE_H 12 #define EIGEN_HOUSEHOLDER_SEQUENCE_H 59 template<
typename VectorsType,
typename CoeffsType,
int S
ide>
62 typedef typename VectorsType::Scalar
Scalar;
63 typedef typename VectorsType::Index
Index;
68 ColsAtCompileTime = RowsAtCompileTime,
71 MaxColsAtCompileTime = MaxRowsAtCompileTime,
76 template<
typename VectorsType,
typename CoeffsType,
int S
ide>
81 typedef typename VectorsType::Index
Index;
82 static inline const EssentialVectorType
essentialVector(
const HouseholderSequenceType& h, Index k)
89 template<
typename VectorsType,
typename CoeffsType>
94 typedef typename VectorsType::Index
Index;
95 static inline const EssentialVectorType
essentialVector(
const HouseholderSequenceType& h, Index k)
106 typedef Matrix<
ResultScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime,
107 0, MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime>
Type;
113 :
public EigenBase<HouseholderSequence<VectorsType,CoeffsType,Side> >
125 typedef typename VectorsType::Index
Index;
131 typename internal::conditional<NumTraits<Scalar>::IsComplex,
155 : m_vectors(v), m_coeffs(h), m_trans(false), m_length(v.diagonalSize()),
162 : m_vectors(other.m_vectors),
163 m_coeffs(other.m_coeffs),
164 m_trans(other.m_trans),
165 m_length(other.m_length),
166 m_shift(other.m_shift)
174 Index
rows()
const {
return Side==
OnTheLeft ? m_vectors.rows() : m_vectors.cols(); }
180 Index
cols()
const {
return rows(); }
227 template<
typename DestType>
inline void evalTo(DestType& dst)
const 229 Matrix<Scalar, DestType::RowsAtCompileTime, 1,
231 evalTo(dst, workspace);
235 template<
typename Dest,
typename Workspace>
236 void evalTo(Dest& dst, Workspace& workspace)
const 238 workspace.resize(rows());
239 Index vecs = m_length;
244 dst.diagonal().setOnes();
245 dst.template triangularView<StrictlyUpper>().setZero();
246 for(Index k = vecs-1; k >= 0; --k)
248 Index cornerSize = rows() - k - m_shift;
250 dst.bottomRightCorner(cornerSize, cornerSize)
251 .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), workspace.data());
253 dst.bottomRightCorner(cornerSize, cornerSize)
254 .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), workspace.data());
257 dst.col(k).tail(rows()-k-1).setZero();
260 for(Index k = 0; k<cols()-vecs ; ++k)
261 dst.col(k).tail(rows()-k-1).setZero();
265 dst.setIdentity(rows(), rows());
266 for(Index k = vecs-1; k >= 0; --k)
268 Index cornerSize = rows() - k - m_shift;
270 dst.bottomRightCorner(cornerSize, cornerSize)
271 .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), &workspace.coeffRef(0));
273 dst.bottomRightCorner(cornerSize, cornerSize)
274 .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), &workspace.coeffRef(0));
283 applyThisOnTheRight(dst, workspace);
287 template<
typename Dest,
typename Workspace>
290 workspace.resize(dst.rows());
291 for(Index k = 0; k < m_length; ++k)
293 Index actual_k = m_trans ? m_length-k-1 : k;
294 dst.rightCols(rows()-m_shift-actual_k)
295 .applyHouseholderOnTheRight(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
303 applyThisOnTheLeft(dst, workspace);
307 template<
typename Dest,
typename Workspace>
310 workspace.resize(dst.cols());
311 for(Index k = 0; k < m_length; ++k)
313 Index actual_k = m_trans ? k : m_length-k-1;
314 dst.bottomRows(rows()-m_shift-actual_k)
315 .applyHouseholderOnTheLeft(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
326 template<
typename OtherDerived>
331 applyThisOnTheLeft(res);
369 Index
length()
const {
return m_length; }
370 Index
shift()
const {
return m_shift; }
391 bool trans()
const {
return m_trans; }
408 template<
typename OtherDerived,
typename VectorsType,
typename CoeffsType,
int S
ide>
421 template<
typename VectorsType,
typename CoeffsType>
433 template<
typename VectorsType,
typename CoeffsType>
441 #endif // EIGEN_HOUSEHOLDER_SEQUENCE_H HouseholderSequence< VectorsType, CoeffsType, OnTheRight > HouseholderSequenceType
HouseholderSequence< VectorsType, CoeffsType > householderSequence(const VectorsType &v, const CoeffsType &h)
Convenience function for constructing a Householder sequence.
Index cols() const
Number of columns of transformation viewed as a matrix.
HouseholderSequence< typename internal::conditional< NumTraits< Scalar >::IsComplex, typename internal::remove_all< typename VectorsType::ConjugateReturnType >::type, VectorsType >::type, typename internal::conditional< NumTraits< Scalar >::IsComplex, typename internal::remove_all< typename CoeffsType::ConjugateReturnType >::type, CoeffsType >::type, Side > ConjugateReturnType
ConjugateReturnType inverse() const
Inverse of the Householder sequence (equals the adjoint).
Matrix< ResultScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime, 0, MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime > Type
HouseholderSequence & setLength(Index length)
Sets the length of the Householder sequence.
internal::hseq_side_dependent_impl< VectorsType, CoeffsType, Side >::EssentialVectorType EssentialVectorType
Expression of the transpose of a matrix.
HouseholderSequence(const HouseholderSequence &other)
Copy constructor.
bool trans() const
Returns the transpose flag.
ConjugateReturnType adjoint() const
Adjoint (conjugate transpose) of the Householder sequence.
iterative scaling algorithm to equilibrate rows and column norms in matrices
VectorsType::Scalar Scalar
HouseholderSequence(const VectorsType &v, const CoeffsType &h)
Constructor.
const internal::permut_matrix_product_retval< PermutationDerived, Derived, OnTheRight > operator*(const MatrixBase< Derived > &matrix, const PermutationBase< PermutationDerived > &permutation)
Block< const VectorsType, Dynamic, 1 > EssentialVectorType
Sequence of Householder reflections acting on subspaces with decreasing size.
NewType cast(const OldType &x)
Transpose< Block< const VectorsType, 1, Dynamic > > EssentialVectorType
void applyThisOnTheLeft(Dest &dst, Workspace &workspace) const
static const EssentialVectorType essentialVector(const HouseholderSequenceType &h, Index k)
HouseholderSequence< VectorsType, CoeffsType, OnTheRight > rightHouseholderSequence(const VectorsType &v, const CoeffsType &h)
Convenience function for constructing a Householder sequence.
HouseholderSequence & setTrans(bool trans)
Sets the transpose flag.
ConjugateReturnType conjugate() const
void evalTo(DestType &dst) const
void evalTo(Dest &dst, Workspace &workspace) const
VectorsType::Nested m_vectors
Index length() const
Returns the length of the Householder sequence.
CoeffsType::Nested m_coeffs
HouseholderSequence & setShift(Index shift)
Sets the shift of the Householder sequence.
VectorsType::StorageKind StorageKind
internal::matrix_type_times_scalar_type< Scalar, OtherDerived >::Type operator*(const MatrixBase< OtherDerived > &other) const
Computes the product of a Householder sequence with a matrix.
const EssentialVectorType essentialVector(Index k) const
Essential part of a Householder vector.
Expression of a fixed-size or dynamic-size block.
void applyThisOnTheRight(Dest &dst, Workspace &workspace) const
scalar_product_traits< OtherScalarType, typename MatrixType::Scalar >::ReturnType ResultScalar
internal::conditional< NumTraits< Scalar >::IsComplex, const CwiseUnaryOp< internal::scalar_conjugate_op< Scalar >, const Derived >, const Derived &>::type ConjugateReturnType
const T::Scalar * extract_data(const T &m)
The matrix class, also used for vectors and row-vectors.
void applyThisOnTheRight(Dest &dst) const
Index shift() const
Returns the shift of the Householder sequence.
HouseholderSequence< VectorsType, CoeffsType, OnTheLeft > HouseholderSequenceType
Base class for all dense matrices, vectors, and expressions.
static const EssentialVectorType essentialVector(const HouseholderSequenceType &h, Index k)
HouseholderSequence transpose() const
Transpose of the Householder sequence.
ConjugateReturnType conjugate() const
Complex conjugate of the Householder sequence.
void applyThisOnTheLeft(Dest &dst) const
Index rows() const
Number of rows of transformation viewed as a matrix.
internal::traits< HouseholderSequence >::Scalar Scalar