12#ifndef EIGEN_BLOCK_HOUSEHOLDER_H
13#define EIGEN_BLOCK_HOUSEHOLDER_H
18#include "./InternalHeaderCheck.h"
26template <
typename TriangularFactorType,
typename VectorsType,
typename CoeffsType>
27void make_block_householder_triangular_factor(TriangularFactorType& triFactor,
const VectorsType& vectors,
28 const CoeffsType& hCoeffs) {
29 const Index nbVecs = vectors.cols();
30 eigen_assert(triFactor.rows() == nbVecs && triFactor.cols() == nbVecs && vectors.rows() >= nbVecs);
32 for (Index i = nbVecs - 1; i >= 0; --i) {
33 Index rs = vectors.rows() - i - 1;
34 Index rt = nbVecs - i - 1;
37 triFactor.row(i).tail(rt).noalias() = -hCoeffs(i) * vectors.col(i).tail(rs).adjoint() *
38 vectors.bottomRightCorner(rs, rt).template triangularView<UnitLower>();
40 triFactor.row(i).tail(rt) =
41 (triFactor.row(i).tail(rt) * triFactor.bottomRightCorner(rt, rt).template triangularView<Upper>()).eval();
43 triFactor(i, i) = hCoeffs(i);
59EIGEN_DIAGNOSTICS(push)
60EIGEN_DIAGNOSTICS_OFF(disable : 4789, ignored
"-Warray-bounds")
62template <
typename MatrixType,
typename VectorsType,
typename CoeffsType>
63void apply_block_householder_on_the_left(MatrixType& mat,
const VectorsType& vectors,
const CoeffsType& hCoeffs,
65 enum { TFactorSize = VectorsType::ColsAtCompileTime };
66 const Index nbVecs = vectors.cols();
67 const Index nbBelow = vectors.rows() - nbVecs;
68 Matrix<typename MatrixType::Scalar, TFactorSize, TFactorSize, RowMajor> T(nbVecs, nbVecs);
71 make_block_householder_triangular_factor(T, vectors, hCoeffs);
73 make_block_householder_triangular_factor(T, vectors, hCoeffs.conjugate());
75 const auto V_top = vectors.topRows(nbVecs);
78 Matrix<
typename MatrixType::Scalar, VectorsType::ColsAtCompileTime, MatrixType::ColsAtCompileTime,
79 (VectorsType::MaxColsAtCompileTime == 1 && MatrixType::MaxColsAtCompileTime != 1) ?
RowMajor :
ColMajor,
80 VectorsType::MaxColsAtCompileTime, MatrixType::MaxColsAtCompileTime>
81 tmp(nbVecs, mat.cols());
82 tmp.noalias() = V_top.template triangularView<UnitLower>().adjoint() * mat.topRows(nbVecs);
84 tmp.noalias() += vectors.bottomRows(nbBelow).adjoint() * mat.bottomRows(nbBelow);
88 tmp = (T.template triangularView<Upper>() * tmp).eval();
90 tmp = (T.template triangularView<Upper>().adjoint() * tmp).eval();
93 mat.topRows(nbVecs).noalias() -= V_top.template triangularView<UnitLower>() * tmp;
95 mat.bottomRows(nbBelow).noalias() -= vectors.bottomRows(nbBelow) * tmp;
103template <
typename MatrixType,
typename VectorsType,
typename CoeffsType>
104void apply_block_householder_on_the_right(MatrixType& mat,
const VectorsType& vectors,
const CoeffsType& hCoeffs,
106 enum { TFactorSize = VectorsType::ColsAtCompileTime };
107 const Index nbVecs = vectors.cols();
108 const Index nbBelow = vectors.rows() - nbVecs;
109 Matrix<typename MatrixType::Scalar, TFactorSize, TFactorSize, RowMajor> T(nbVecs, nbVecs);
112 make_block_householder_triangular_factor(T, vectors, hCoeffs);
114 make_block_householder_triangular_factor(T, vectors, hCoeffs.conjugate());
116 const auto V_top = vectors.topRows(nbVecs);
119 Matrix<
typename MatrixType::Scalar, MatrixType::RowsAtCompileTime, VectorsType::ColsAtCompileTime,
120 (VectorsType::MaxColsAtCompileTime == 1 && MatrixType::MaxRowsAtCompileTime != 1) ?
ColMajor :
RowMajor,
121 MatrixType::MaxRowsAtCompileTime, VectorsType::MaxColsAtCompileTime>
122 tmp(mat.rows(), nbVecs);
123 tmp.noalias() = mat.leftCols(nbVecs) * V_top.template triangularView<UnitLower>();
125 tmp.noalias() += mat.rightCols(nbBelow) * vectors.bottomRows(nbBelow);
129 tmp = (tmp * T.template triangularView<Upper>()).eval();
131 tmp = (tmp * T.template triangularView<Upper>().adjoint()).eval();
134 mat.leftCols(nbVecs).noalias() -= tmp * V_top.template triangularView<UnitLower>().adjoint();
136 mat.rightCols(nbBelow).noalias() -= tmp * vectors.bottomRows(nbBelow).adjoint();
140EIGEN_DIAGNOSTICS(pop)
@ ColMajor
Definition Constants.h:319
@ RowMajor
Definition Constants.h:321