11#ifndef EIGEN_TRIDIAGONALIZATION_H
12#define EIGEN_TRIDIAGONALIZATION_H
18template<
typename MatrixType>
struct TridiagonalizationMatrixTReturnType;
19template<
typename MatrixType>
21 :
public traits<typename MatrixType::PlainObject>
23 typedef typename MatrixType::PlainObject ReturnType;
27template<
typename MatrixType,
typename CoeffVectorType>
28void tridiagonalization_inplace(MatrixType&
matA, CoeffVectorType& hCoeffs);
70 typedef typename MatrixType::Scalar Scalar;
71 typedef typename NumTraits<Scalar>::Real
RealScalar;
75 Size = MatrixType::RowsAtCompileTime,
76 SizeMinusOne = Size == Dynamic ? Dynamic : (Size > 1 ? Size - 1 : 1),
77 Options = MatrixType::Options,
78 MaxSize = MatrixType::MaxRowsAtCompileTime,
79 MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : (MaxSize > 1 ? MaxSize - 1 : 1)
91 >::type DiagonalReturnType;
96 >::type SubDiagonalReturnType;
114 : m_matrix(size,size),
115 m_hCoeffs(size > 1 ? size-1 : 1),
116 m_isInitialized(
false)
129 template<
typename InputType>
131 : m_matrix(matrix.derived()),
132 m_hCoeffs(matrix.cols() > 1 ? matrix.cols()-1 : 1),
133 m_isInitialized(
false)
135 internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);
136 m_isInitialized =
true;
156 template<
typename InputType>
159 m_matrix = matrix.derived();
160 m_hCoeffs.
resize(matrix.rows()-1, 1);
161 internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);
162 m_isInitialized =
true;
184 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
221 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
242 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
244 .setLength(m_matrix.rows() - 1)
267 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
284 DiagonalReturnType
diagonal()
const;
301 CoeffVectorType m_hCoeffs;
302 bool m_isInitialized;
305template<
typename MatrixType>
306typename Tridiagonalization<MatrixType>::DiagonalReturnType
309 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
310 return m_matrix.diagonal().real();
313template<
typename MatrixType>
317 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
318 return m_matrix.template diagonal<-1>().real();
346template<
typename MatrixType,
typename CoeffVectorType>
347void tridiagonalization_inplace(MatrixType&
matA, CoeffVectorType& hCoeffs)
350 typedef typename MatrixType::Scalar Scalar;
351 typedef typename MatrixType::RealScalar RealScalar;
352 Index n =
matA.rows();
353 eigen_assert(n==
matA.cols());
354 eigen_assert(n==hCoeffs.size()+1 || n==1);
356 for (Index i = 0; i<n-1; ++i)
365 matA.col(i).coeffRef(i+1) = 1;
375 matA.col(i).coeffRef(i+1) = beta;
376 hCoeffs.coeffRef(i) = h;
381template<
typename MatrixType,
382 int Size=MatrixType::ColsAtCompileTime,
383 bool IsComplex=NumTraits<typename MatrixType::Scalar>::IsComplex>
384struct tridiagonalization_inplace_selector;
426template<
typename MatrixType,
typename DiagonalType,
typename SubDiagonalType>
427void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
bool extractQ)
429 eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1);
430 tridiagonalization_inplace_selector<MatrixType>::run(mat, diag, subdiag, extractQ);
436template<
typename MatrixType,
int Size,
bool IsComplex>
441 template<
typename DiagonalType,
typename SubDiagonalType>
445 tridiagonalization_inplace(
mat,hCoeffs);
450 .setLength(
mat.rows() - 1)
459template<
typename MatrixType>
462 typedef typename MatrixType::Scalar Scalar;
463 typedef typename MatrixType::RealScalar RealScalar;
465 template<
typename DiagonalType,
typename SubDiagonalType>
469 const RealScalar
tol = (std::numeric_limits<RealScalar>::min)();
483 RealScalar beta = sqrt(numext::abs2(
mat(1,0)) +
v1norm2);
484 RealScalar
invBeta = RealScalar(1)/beta;
505template<
typename MatrixType,
bool IsComplex>
508 typedef typename MatrixType::Scalar Scalar;
510 template<
typename DiagonalType,
typename SubDiagonalType>
511 static void run(MatrixType&
mat, DiagonalType&
diag, SubDiagonalType&,
bool extractQ)
513 diag(0,0) = numext::real(
mat(0,0));
515 mat(0,0) = Scalar(1);
527:
public ReturnByValue<TridiagonalizationMatrixTReturnType<MatrixType> >
536 template <
typename ResultType>
537 inline void evalTo(ResultType& result)
const
540 result.template
diagonal<1>() = m_matrix.template diagonal<-1>().conjugate();
541 result.diagonal() = m_matrix.diagonal();
542 result.template diagonal<-1>() = m_matrix.template
diagonal<-1>();
545 Index rows()
const {
return m_matrix.rows(); }
546 Index cols()
const {
return m_matrix.cols(); }
549 typename MatrixType::Nested m_matrix;
Expression of a diagonal/subdiagonal/superdiagonal in a matrix.
Definition Diagonal.h:65
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Resizes *this to a rows x cols matrix.
Definition PlainObjectBase.h:252
Definition ReturnByValue.h:53
Pseudo expression representing a solving operation.
Definition Solve.h:63
\eigenvalues_module
Definition Tridiagonalization.h:64
HouseholderSequenceType matrixQ() const
Returns the unitary matrix Q in the decomposition.
Definition Tridiagonalization.h:240
Tridiagonalization(const EigenBase< InputType > &matrix)
Constructor; computes tridiagonal decomposition of given matrix.
Definition Tridiagonalization.h:130
DiagonalReturnType diagonal() const
Returns the diagonal of the tridiagonal matrix T in the decomposition.
Definition Tridiagonalization.h:307
MatrixTReturnType matrixT() const
Returns an expression of the tridiagonal matrix T in the decomposition.
Definition Tridiagonalization.h:265
Eigen::Index Index
Definition Tridiagonalization.h:72
const MatrixType & packedMatrix() const
Returns the internal representation of the decomposition.
Definition Tridiagonalization.h:219
Tridiagonalization & compute(const EigenBase< InputType > &matrix)
Computes tridiagonal decomposition of given matrix.
Definition Tridiagonalization.h:157
Tridiagonalization(Index size=Size==Dynamic ? 2 :Size)
Default constructor.
Definition Tridiagonalization.h:113
SubDiagonalReturnType subDiagonal() const
Returns the subdiagonal of the tridiagonal matrix T in the decomposition.
Definition Tridiagonalization.h:315
CoeffVectorType householderCoefficients() const
Returns the Householder coefficients.
Definition Tridiagonalization.h:182
_MatrixType MatrixType
Synonym for the template parameter _MatrixType.
Definition Tridiagonalization.h:68
HouseholderSequence< MatrixType, typename internal::remove_all< typename CoeffVectorType::ConjugateReturnType >::type > HouseholderSequenceType
Return type of matrixQ()
Definition Tridiagonalization.h:99
Definition Tridiagonalization.h:528
TridiagonalizationMatrixTReturnType(const MatrixType &mat)
Constructor.
Definition Tridiagonalization.h:534
Definition ForwardDeclarations.h:17
Definition Tridiagonalization.h:438