TR-mbed 1.0
Loading...
Searching...
No Matches
Tridiagonalization.h
Go to the documentation of this file.
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5// Copyright (C) 2010 Jitse Niesen <jitse@maths.leeds.ac.uk>
6//
7// This Source Code Form is subject to the terms of the Mozilla
8// Public License v. 2.0. If a copy of the MPL was not distributed
9// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11#ifndef EIGEN_TRIDIAGONALIZATION_H
12#define EIGEN_TRIDIAGONALIZATION_H
13
14namespace Eigen {
15
16namespace internal {
17
18template<typename MatrixType> struct TridiagonalizationMatrixTReturnType;
19template<typename MatrixType>
21 : public traits<typename MatrixType::PlainObject>
22{
23 typedef typename MatrixType::PlainObject ReturnType; // FIXME shall it be a BandMatrix?
24 enum { Flags = 0 };
25};
26
27template<typename MatrixType, typename CoeffVectorType>
29void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);
30}
31
64template<typename _MatrixType> class Tridiagonalization
65{
66 public:
67
69 typedef _MatrixType MatrixType;
70
71 typedef typename MatrixType::Scalar Scalar;
74
75 enum {
76 Size = MatrixType::RowsAtCompileTime,
77 SizeMinusOne = Size == Dynamic ? Dynamic : (Size > 1 ? Size - 1 : 1),
78 Options = MatrixType::Options,
79 MaxSize = MatrixType::MaxRowsAtCompileTime,
80 MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : (MaxSize > 1 ? MaxSize - 1 : 1)
81 };
82
88
93
96 const Diagonal<const MatrixType, -1>
98
101
115 : m_matrix(size,size),
116 m_hCoeffs(size > 1 ? size-1 : 1),
117 m_isInitialized(false)
118 {}
119
130 template<typename InputType>
139
157 template<typename InputType>
159 {
160 m_matrix = matrix.derived();
161 m_hCoeffs.resize(matrix.rows()-1, 1);
163 m_isInitialized = true;
164 return *this;
165 }
166
184 {
185 eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
186 return m_hCoeffs;
187 }
188
220 inline const MatrixType& packedMatrix() const
221 {
222 eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
223 return m_matrix;
224 }
225
242 {
243 eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
244 return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate())
245 .setLength(m_matrix.rows() - 1)
246 .setShift(1);
247 }
248
267 {
268 eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
269 return MatrixTReturnType(m_matrix.real());
270 }
271
286
298
299 protected:
300
304};
305
306template<typename MatrixType>
309{
310 eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
311 return m_matrix.diagonal().real();
312}
313
314template<typename MatrixType>
317{
318 eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
319 return m_matrix.template diagonal<-1>().real();
320}
321
322namespace internal {
323
347template<typename MatrixType, typename CoeffVectorType>
349void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)
350{
351 using numext::conj;
352 typedef typename MatrixType::Scalar Scalar;
353 typedef typename MatrixType::RealScalar RealScalar;
354 Index n = matA.rows();
355 eigen_assert(n==matA.cols());
356 eigen_assert(n==hCoeffs.size()+1 || n==1);
357
358 for (Index i = 0; i<n-1; ++i)
359 {
361 RealScalar beta;
362 Scalar h;
363 matA.col(i).tail(remainingSize).makeHouseholderInPlace(h, beta);
364
365 // Apply similarity transformation to remaining columns,
366 // i.e., A = H A H' where H = I - h v v' and v = matA.col(i).tail(n-i-1)
367 matA.col(i).coeffRef(i+1) = 1;
368
369 hCoeffs.tail(n-i-1).noalias() = (matA.bottomRightCorner(remainingSize,remainingSize).template selfadjointView<Lower>()
370 * (conj(h) * matA.col(i).tail(remainingSize)));
371
372 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);
373
374 matA.bottomRightCorner(remainingSize, remainingSize).template selfadjointView<Lower>()
375 .rankUpdate(matA.col(i).tail(remainingSize), hCoeffs.tail(remainingSize), Scalar(-1));
376
377 matA.col(i).coeffRef(i+1) = beta;
378 hCoeffs.coeffRef(i) = h;
379 }
380}
381
382// forward declaration, implementation at the end of this file
383template<typename MatrixType,
384 int Size=MatrixType::ColsAtCompileTime,
386struct tridiagonalization_inplace_selector;
387
428template<typename MatrixType, typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
430void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag,
431 CoeffVectorType& hcoeffs, bool extractQ)
432{
433 eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1);
435}
436
440template<typename MatrixType, int Size, bool IsComplex>
442{
445 template<typename DiagonalType, typename SubDiagonalType>
446 static EIGEN_DEVICE_FUNC
447 void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType& hCoeffs, bool extractQ)
448 {
450 diag = mat.diagonal().real();
451 subdiag = mat.template diagonal<-1>().real();
452 if(extractQ)
453 mat = HouseholderSequenceType(mat, hCoeffs.conjugate())
454 .setLength(mat.rows() - 1)
455 .setShift(1);
456 }
457};
458
463template<typename MatrixType>
465{
466 typedef typename MatrixType::Scalar Scalar;
467 typedef typename MatrixType::RealScalar RealScalar;
468
469 template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
470 static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, CoeffVectorType&, bool extractQ)
471 {
472 using std::sqrt;
473 const RealScalar tol = (std::numeric_limits<RealScalar>::min)();
474 diag[0] = mat(0,0);
475 RealScalar v1norm2 = numext::abs2(mat(2,0));
476 if(v1norm2 <= tol)
477 {
478 diag[1] = mat(1,1);
479 diag[2] = mat(2,2);
480 subdiag[0] = mat(1,0);
481 subdiag[1] = mat(2,1);
482 if (extractQ)
483 mat.setIdentity();
484 }
485 else
486 {
487 RealScalar beta = sqrt(numext::abs2(mat(1,0)) + v1norm2);
488 RealScalar invBeta = RealScalar(1)/beta;
489 Scalar m01 = mat(1,0) * invBeta;
490 Scalar m02 = mat(2,0) * invBeta;
491 Scalar q = RealScalar(2)*m01*mat(2,1) + m02*(mat(2,2) - mat(1,1));
492 diag[1] = mat(1,1) + m02*q;
493 diag[2] = mat(2,2) - m02*q;
494 subdiag[0] = beta;
495 subdiag[1] = mat(2,1) - m01 * q;
496 if (extractQ)
497 {
498 mat << 1, 0, 0,
499 0, m01, m02,
500 0, m02, -m01;
501 }
502 }
503 }
504};
505
509template<typename MatrixType, bool IsComplex>
511{
512 typedef typename MatrixType::Scalar Scalar;
513
514 template<typename DiagonalType, typename SubDiagonalType, typename CoeffVectorType>
515 static EIGEN_DEVICE_FUNC
516 void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, CoeffVectorType&, bool extractQ)
517 {
518 diag(0,0) = numext::real(mat(0,0));
519 if(extractQ)
520 mat(0,0) = Scalar(1);
521 }
522};
523
531template<typename MatrixType> struct TridiagonalizationMatrixTReturnType
532: public ReturnByValue<TridiagonalizationMatrixTReturnType<MatrixType> >
533{
534 public:
540
541 template <typename ResultType>
542 inline void evalTo(ResultType& result) const
543 {
544 result.setZero();
545 result.template diagonal<1>() = m_matrix.template diagonal<-1>().conjugate();
546 result.diagonal() = m_matrix.diagonal();
547 result.template diagonal<-1>() = m_matrix.template diagonal<-1>();
548 }
549
550 EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT { return m_matrix.rows(); }
551 EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT { return m_matrix.cols(); }
552
553 protected:
554 typename MatrixType::Nested m_matrix;
555};
556
557} // end namespace internal
558
559} // end namespace Eigen
560
561#endif // EIGEN_TRIDIAGONALIZATION_H
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition AnnoyingScalar.h:104
int n
Definition BiCGSTAB_simple.cpp:1
int i
Definition BiCGSTAB_step_by_step.cpp:9
internal::conditional< NumTraits< Scalar >::IsComplex, constCwiseUnaryOp< internal::scalar_real_op< Scalar >, constDerived >, constDerived & >::type RealReturnType
Definition CommonCwiseUnaryOps.h:24
EIGEN_DEVICE_FUNC ConjugateReturnType conjugate() const
Definition CommonCwiseUnaryOps.h:74
#define EIGEN_NOEXCEPT
Definition Macros.h:1418
#define EIGEN_CONSTEXPR
Definition Macros.h:787
#define EIGEN_DEVICE_FUNC
Definition Macros.h:976
#define eigen_assert(x)
Definition Macros.h:1037
MatrixXf matA(2, 2)
MatrixXf mat
Definition Tutorial_AdvancedInitialization_CommaTemporary.cpp:1
int cols
Definition Tutorial_commainit_02.cpp:1
Scalar Scalar int size
Definition benchVecAdd.cpp:17
SCALAR Scalar
Definition bench_gemm.cpp:46
NumTraits< Scalar >::Real RealScalar
Definition bench_gemm.cpp:47
MatrixXf MatrixType
Definition benchmark-blocking-sizes.cpp:52
Expression of a diagonal/subdiagonal/superdiagonal in a matrix.
Definition Diagonal.h:65
Sequence of Householder reflections acting on subspaces with decreasing size.
Definition HouseholderSequence.h:121
EIGEN_DEVICE_FUNC HouseholderSequence & setShift(Index shift)
Sets the shift of the Householder sequence.
Definition HouseholderSequence.h:461
EIGEN_DEVICE_FUNC HouseholderSequence & setLength(Index length)
Sets the length of the Householder sequence.
Definition HouseholderSequence.h:443
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:180
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition PlainObjectBase.h:271
Definition ReturnByValue.h:52
Tridiagonal decomposition of a selfadjoint matrix.
Definition Tridiagonalization.h:65
HouseholderSequenceType matrixQ() const
Returns the unitary matrix Q in the decomposition.
Definition Tridiagonalization.h:241
Tridiagonalization(const EigenBase< InputType > &matrix)
Constructor; computes tridiagonal decomposition of given matrix.
Definition Tridiagonalization.h:131
DiagonalReturnType diagonal() const
Returns the diagonal of the tridiagonal matrix T in the decomposition.
Definition Tridiagonalization.h:308
@ Size
Definition Tridiagonalization.h:76
@ MaxSize
Definition Tridiagonalization.h:79
@ MaxSizeMinusOne
Definition Tridiagonalization.h:80
@ SizeMinusOne
Definition Tridiagonalization.h:77
@ Options
Definition Tridiagonalization.h:78
internal::remove_all< typenameMatrixType::RealReturnType >::type MatrixTypeRealView
Definition Tridiagonalization.h:86
Matrix< RealScalar, SizeMinusOne, 1, Options &~RowMajor, MaxSizeMinusOne, 1 > SubDiagonalType
Definition Tridiagonalization.h:85
internal::conditional< NumTraits< Scalar >::IsComplex, typenameinternal::add_const_on_value_type< typenameDiagonal< constMatrixType >::RealReturnType >::type, constDiagonal< constMatrixType > >::type DiagonalReturnType
Definition Tridiagonalization.h:92
MatrixTReturnType matrixT() const
Returns an expression of the tridiagonal matrix T in the decomposition.
Definition Tridiagonalization.h:266
CoeffVectorType m_hCoeffs
Definition Tridiagonalization.h:302
Eigen::Index Index
Definition Tridiagonalization.h:73
const MatrixType & packedMatrix() const
Returns the internal representation of the decomposition.
Definition Tridiagonalization.h:220
Tridiagonalization & compute(const EigenBase< InputType > &matrix)
Computes tridiagonal decomposition of given matrix.
Definition Tridiagonalization.h:158
NumTraits< Scalar >::Real RealScalar
Definition Tridiagonalization.h:72
Tridiagonalization(Index size=Size==Dynamic ? 2 :Size)
Default constructor.
Definition Tridiagonalization.h:114
internal::conditional< NumTraits< Scalar >::IsComplex, typenameinternal::add_const_on_value_type< typenameDiagonal< constMatrixType,-1 >::RealReturnType >::type, constDiagonal< constMatrixType,-1 > >::type SubDiagonalReturnType
Definition Tridiagonalization.h:97
SubDiagonalReturnType subDiagonal() const
Returns the subdiagonal of the tridiagonal matrix T in the decomposition.
Definition Tridiagonalization.h:316
CoeffVectorType householderCoefficients() const
Returns the Householder coefficients.
Definition Tridiagonalization.h:183
bool m_isInitialized
Definition Tridiagonalization.h:303
MatrixType m_matrix
Definition Tridiagonalization.h:301
Matrix< Scalar, SizeMinusOne, 1, Options &~RowMajor, MaxSizeMinusOne, 1 > CoeffVectorType
Definition Tridiagonalization.h:83
_MatrixType MatrixType
Synonym for the template parameter _MatrixType.
Definition Tridiagonalization.h:69
internal::plain_col_type< MatrixType, RealScalar >::type DiagonalType
Definition Tridiagonalization.h:84
HouseholderSequence< MatrixType, typename internal::remove_all< typename CoeffVectorType::ConjugateReturnType >::type > HouseholderSequenceType
Return type of matrixQ()
Definition Tridiagonalization.h:100
MatrixType::Scalar Scalar
Definition Tridiagonalization.h:71
internal::TridiagonalizationMatrixTReturnType< MatrixTypeRealView > MatrixTReturnType
Definition Tridiagonalization.h:87
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition common.h:110
@ IsComplex
Definition common.h:98
void diagonal(const MatrixType &m)
Definition diagonal.cpp:12
EIGEN_DEVICE_FUNC void tridiagonalization_inplace(MatrixType &matA, CoeffVectorType &hCoeffs)
Definition Tridiagonalization.h:349
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
const int Dynamic
Definition Constants.h:22
Definition BandTriangularSolver.h:13
Definition EigenBase.h:30
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition NumTraits.h:233
Definition Tridiagonalization.h:533
MatrixType::Nested m_matrix
Definition Tridiagonalization.h:554
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition Tridiagonalization.h:551
void evalTo(ResultType &result) const
Definition Tridiagonalization.h:542
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition Tridiagonalization.h:550
TridiagonalizationMatrixTReturnType(const MatrixType &mat)
Constructor.
Definition Tridiagonalization.h:539
MatrixType::PlainObject ReturnType
Definition Tridiagonalization.h:23
Definition ForwardDeclarations.h:17
MatrixType::Scalar Scalar
Definition Tridiagonalization.h:512
static EIGEN_DEVICE_FUNC void run(MatrixType &mat, DiagonalType &diag, SubDiagonalType &, CoeffVectorType &, bool extractQ)
Definition Tridiagonalization.h:516
static void run(MatrixType &mat, DiagonalType &diag, SubDiagonalType &subdiag, CoeffVectorType &, bool extractQ)
Definition Tridiagonalization.h:470
MatrixType::Scalar Scalar
Definition Tridiagonalization.h:466
MatrixType::RealScalar RealScalar
Definition Tridiagonalization.h:467
Definition Tridiagonalization.h:442
static EIGEN_DEVICE_FUNC void run(MatrixType &mat, DiagonalType &diag, SubDiagonalType &subdiag, CoeffVectorType &hCoeffs, bool extractQ)
Definition Tridiagonalization.h:447
Tridiagonalization< MatrixType >::CoeffVectorType CoeffVectorType
Definition Tridiagonalization.h:443
Tridiagonalization< MatrixType >::HouseholderSequenceType HouseholderSequenceType
Definition Tridiagonalization.h:444
Definition main.h:100