66 EssentialPart& essential,
68 RealScalar& beta)
const
73 EIGEN_STATIC_ASSERT_VECTOR_ONLY(EssentialPart)
74 VectorBlock<const Derived, EssentialPart::SizeAtCompileTime> tail(derived(), 1, size()-1);
76 RealScalar tailSqNorm = size()==1 ? RealScalar(0) : tail.squaredNorm();
78 const RealScalar tol = (std::numeric_limits<RealScalar>::min)();
80 if(tailSqNorm <= tol && numext::abs2(numext::imag(c0))<=tol)
83 beta = numext::real(c0);
88 beta = sqrt(numext::abs2(c0) + tailSqNorm);
89 if (numext::real(c0)>=RealScalar(0))
91 essential = tail / (c0 - beta);
92 tau =
conj((beta - c0) / beta);
114 const EssentialPart& essential,
124 Map<typename internal::plain_row_type<PlainObject>::type> tmp(workspace,cols());
125 Block<Derived, EssentialPart::SizeAtCompileTime, Derived::ColsAtCompileTime> bottom(derived(), 1, 0, rows()-1, cols());
126 tmp.noalias() = essential.adjoint() * bottom;
128 this->row(0) -= tau * tmp;
129 bottom.noalias() -= tau * essential * tmp;
151 const EssentialPart& essential,
161 Map<typename internal::plain_col_type<PlainObject>::type> tmp(workspace,rows());
162 Block<Derived, Derived::RowsAtCompileTime, EssentialPart::SizeAtCompileTime> right(derived(), 0, 1, rows(), cols()-1);
163 tmp.noalias() = right * essential.conjugate();
165 this->col(0) -= tau * tmp;
166 right.noalias() -= tau * tmp * essential.transpose();