11 #ifndef EIGEN_TRIDIAGONALIZATION_H 12 #define EIGEN_TRIDIAGONALIZATION_H 19 template<
typename MatrixType>
21 :
public traits<typename MatrixType::PlainObject>
23 typedef typename MatrixType::PlainObject ReturnType;
27 template<
typename MatrixType,
typename CoeffVectorType>
28 void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);
70 typedef typename MatrixType::Scalar Scalar;
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)
93 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
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>
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.");
243 return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate())
244 .setLength(m_matrix.rows() - 1)
267 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
268 return MatrixTReturnType(m_matrix.real());
284 DiagonalReturnType diagonal()
const;
296 SubDiagonalReturnType subDiagonal()
const;
301 CoeffVectorType m_hCoeffs;
302 bool m_isInitialized;
305 template<
typename MatrixType>
309 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
310 return m_matrix.diagonal().real();
313 template<
typename MatrixType>
317 eigen_assert(m_isInitialized &&
"Tridiagonalization is not initialized.");
318 return m_matrix.template diagonal<-1>().real();
346 template<
typename MatrixType,
typename CoeffVectorType>
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)
358 Index remainingSize = n-i-1;
361 matA.col(i).tail(remainingSize).makeHouseholderInPlace(h, beta);
365 matA.col(i).coeffRef(i+1) = 1;
367 hCoeffs.tail(n-i-1).noalias() = (matA.bottomRightCorner(remainingSize,remainingSize).template selfadjointView<Lower>()
368 * (conj(h) * matA.col(i).tail(remainingSize)));
370 hCoeffs.tail(n-i-1) += (conj(h)*RealScalar(-0.5)*(hCoeffs.tail(remainingSize).dot(matA.col(i).tail(remainingSize)))) * matA.col(i).tail(n-i-1);
372 matA.bottomRightCorner(remainingSize, remainingSize).template selfadjointView<Lower>()
373 .rankUpdate(matA.col(i).tail(remainingSize), hCoeffs.tail(remainingSize), Scalar(-1));
382 int Size=MatrixType::ColsAtCompileTime,
426 template<
typename MatrixType,
typename DiagonalType,
typename SubDiagonalType>
427 void 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);
436 template<
typename MatrixType,
int Size,
bool IsComplex>
441 template<
typename DiagonalType,
typename SubDiagonalType>
442 static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
bool extractQ)
444 CoeffVectorType hCoeffs(mat.cols()-1);
445 tridiagonalization_inplace(mat,hCoeffs);
446 diag = mat.diagonal().real();
447 subdiag = mat.template diagonal<-1>().real();
449 mat = HouseholderSequenceType(mat, hCoeffs.conjugate())
450 .setLength(mat.rows() - 1)
459 template<
typename MatrixType>
462 typedef typename MatrixType::Scalar Scalar;
463 typedef typename MatrixType::RealScalar RealScalar;
465 template<
typename DiagonalType,
typename SubDiagonalType>
466 static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
bool extractQ)
469 const RealScalar tol = (std::numeric_limits<RealScalar>::min)();
471 RealScalar v1norm2 = numext::abs2(mat(2,0));
476 subdiag[0] = mat(1,0);
477 subdiag[1] = mat(2,1);
483 RealScalar beta = sqrt(numext::abs2(mat(1,0)) + v1norm2);
484 RealScalar invBeta = RealScalar(1)/beta;
485 Scalar m01 = mat(1,0) * invBeta;
486 Scalar m02 = mat(2,0) * invBeta;
487 Scalar q = RealScalar(2)*m01*mat(2,1) + m02*(mat(2,2) - mat(1,1));
488 diag[1] = mat(1,1) + m02*q;
489 diag[2] = mat(2,2) - m02*q;
491 subdiag[1] = mat(2,1) - m01 * q;
505 template<
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;
556 #endif // EIGEN_TRIDIAGONALIZATION_H Tridiagonalization(Index size=Size==Dynamic ? 2 :Size)
Default constructor.
Definition: Tridiagonalization.h:113
DiagonalReturnType diagonal() const
Returns the diagonal of the tridiagonal matrix T in the decomposition.
Definition: Tridiagonalization.h:307
HouseholderSequence< MatrixType, typename internal::remove_all< typename CoeffVectorType::ConjugateReturnType >::type > HouseholderSequenceType
Return type of matrixQ()
Definition: Tridiagonalization.h:99
Definition: Tridiagonalization.h:384
EIGEN_DEVICE_FUNC Index rows() const
Definition: EigenBase.h:58
Eigen::Index Index
Definition: Tridiagonalization.h:72
HouseholderSequenceType matrixQ() const
Returns the unitary matrix Q in the decomposition.
Definition: Tridiagonalization.h:240
Definition: Tridiagonalization.h:18
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:85
Tridiagonalization & compute(const EigenBase< InputType > &matrix)
Computes tridiagonal decomposition of given matrix.
Definition: Tridiagonalization.h:157
Holds information about the various numeric (i.e.
Definition: NumTraits.h:150
Definition: Tridiagonalization.h:63
Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor Matrix...
Definition: EigenBase.h:28
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index rowId, Index colId)
This is an overloaded version of DenseCoeffsBase<Derived,WriteAccessors>::coeffRef(Index,Index) const provided to by-pass the creation of an evaluator of the expression, thus saving compilation efforts.
Definition: PlainObjectBase.h:177
Definition: ReturnByValue.h:50
Definition: ForwardDeclarations.h:262
const MatrixType & packedMatrix() const
Returns the internal representation of the decomposition.
Definition: Tridiagonalization.h:219
CoeffVectorType householderCoefficients() const
Returns the Householder coefficients.
Definition: Tridiagonalization.h:182
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
MatrixTReturnType matrixT() const
Returns an expression of the tridiagonal matrix T in the decomposition.
Definition: Tridiagonalization.h:265
Tridiagonalization(const EigenBase< InputType > &matrix)
Constructor; computes tridiagonal decomposition of given matrix.
Definition: Tridiagonalization.h:130
Definition: BandTriangularSolver.h:13
TridiagonalizationMatrixTReturnType(const MatrixType &mat)
Constructor.
Definition: Tridiagonalization.h:534
Expression of a diagonal/subdiagonal/superdiagonal in a matrix.
Definition: Diagonal.h:63
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time, and that instead the value is stored in some runtime variable.
Definition: Constants.h:21
Generic expression where a coefficient-wise unary operator is applied to an expression.
Definition: CwiseUnaryOp.h:55
_MatrixType MatrixType
Synonym for the template parameter _MatrixType.
Definition: Tridiagonalization.h:68
EIGEN_DEVICE_FUNC Derived & derived()
Definition: EigenBase.h:44
Definition: ForwardDeclarations.h:17
SubDiagonalReturnType subDiagonal() const
Returns the subdiagonal of the tridiagonal matrix T in the decomposition.
Definition: Tridiagonalization.h:315