26 #ifndef EIGEN_HOUSEHOLDER_SEQUENCE_H
27 #define EIGEN_HOUSEHOLDER_SEQUENCE_H
74 template<
typename VectorsType,
typename CoeffsType,
int S
ide>
75 struct traits<HouseholderSequence<VectorsType,CoeffsType,Side> >
77 typedef typename VectorsType::Scalar Scalar;
78 typedef typename VectorsType::Index Index;
79 typedef typename VectorsType::StorageKind StorageKind;
83 ColsAtCompileTime = RowsAtCompileTime,
86 MaxColsAtCompileTime = MaxRowsAtCompileTime,
91 template<
typename VectorsType,
typename CoeffsType,
int S
ide>
92 struct hseq_side_dependent_impl
94 typedef Block<const VectorsType, Dynamic, 1> EssentialVectorType;
95 typedef HouseholderSequence<VectorsType, CoeffsType, OnTheLeft> HouseholderSequenceType;
96 typedef typename VectorsType::Index Index;
97 static inline const EssentialVectorType essentialVector(
const HouseholderSequenceType& h, Index k)
99 Index start = k+1+h.m_shift;
100 return Block<const VectorsType,Dynamic,1>(h.m_vectors, start, k, h.rows()-start, 1);
104 template<
typename VectorsType,
typename CoeffsType>
105 struct hseq_side_dependent_impl<VectorsType, CoeffsType,
OnTheRight>
107 typedef Transpose<Block<const VectorsType, 1, Dynamic> > EssentialVectorType;
108 typedef HouseholderSequence<VectorsType, CoeffsType, OnTheRight> HouseholderSequenceType;
109 typedef typename VectorsType::Index Index;
110 static inline const EssentialVectorType essentialVector(
const HouseholderSequenceType& h, Index k)
112 Index start = k+1+h.m_shift;
113 return Block<const VectorsType,1,Dynamic>(h.m_vectors, k, start, 1, h.rows()-start).transpose();
117 template<
typename OtherScalarType,
typename MatrixType>
struct matrix_type_times_scalar_type
119 typedef typename scalar_product_traits<OtherScalarType, typename MatrixType::Scalar>::ReturnType
121 typedef Matrix<ResultScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime,
122 0, MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime>
Type;
128 :
public EigenBase<HouseholderSequence<VectorsType,CoeffsType,Side> >
131 RowsAtCompileTime = internal::traits<HouseholderSequence>::RowsAtCompileTime,
132 ColsAtCompileTime = internal::traits<HouseholderSequence>::ColsAtCompileTime,
133 MaxRowsAtCompileTime = internal::traits<HouseholderSequence>::MaxRowsAtCompileTime,
134 MaxColsAtCompileTime = internal::traits<HouseholderSequence>::MaxColsAtCompileTime
136 typedef typename internal::traits<HouseholderSequence>::Scalar Scalar;
137 typedef typename VectorsType::Index Index;
147 typename internal::remove_all<typename CoeffsType::ConjugateReturnType>::type,
242 template<
typename DestType>
inline void evalTo(DestType& dst)
const
244 Matrix<Scalar, DestType::RowsAtCompileTime, 1,
250 template<
typename Dest,
typename Workspace>
251 void evalTo(Dest& dst, Workspace& workspace)
const
253 workspace.resize(
rows());
255 if( internal::is_same<
typename internal::remove_all<VectorsType>::type,Dest>::value
259 dst.diagonal().setOnes();
260 dst.template triangularView<StrictlyUpper>().setZero();
261 for(Index k = vecs-1; k >= 0; --k)
265 dst.bottomRightCorner(cornerSize, cornerSize)
268 dst.bottomRightCorner(cornerSize, cornerSize)
272 dst.col(k).tail(
rows()-k-1).setZero();
275 for(Index k = 0; k<
cols()-vecs ; ++k)
276 dst.col(k).tail(
rows()-k-1).setZero();
281 for(Index k = vecs-1; k >= 0; --k)
285 dst.bottomRightCorner(cornerSize, cornerSize)
288 dst.bottomRightCorner(cornerSize, cornerSize)
302 template<
typename Dest,
typename Workspace>
305 workspace.resize(dst.rows());
308 Index actual_k =
m_trans ? m_length-k-1 : k;
322 template<
typename Dest,
typename Workspace>
325 workspace.resize(dst.cols());
328 Index actual_k =
m_trans ? k : m_length-k-1;
341 template<
typename OtherDerived>
345 res(other.template
cast<
typename internal::matrix_type_times_scalar_type<Scalar,OtherDerived>::ResultScalar>());
350 template<
typename _VectorsType,
typename _CoeffsType,
int _S
ide>
friend struct internal::hseq_side_dependent_impl;
423 template<
typename OtherDerived,
typename VectorsType,
typename CoeffsType,
int S
ide>
427 res(other.template
cast<
typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::ResultScalar>());
436 template<
typename VectorsType,
typename CoeffsType>
448 template<
typename VectorsType,
typename CoeffsType>
456 #endif // EIGEN_HOUSEHOLDER_SEQUENCE_H