Spec-Zone.ru › Eigen3

Eigen::Tridiagonalization

template<typename _MatrixType>
class Eigen::Tridiagonalization< _MatrixType >

Тридиагональное разложение самосопряженной матрицы.

Это определено в модуле Eigenvalues.

#include <Eigen/Eigenvalues> 
Параметры шаблона
_MatrixType тип матрицы, для которой вычисляется тридиагональное разложение; ожидается, что это будет экземпляр шаблона класса Matrix.

Этот класс выполняет тридиагональное разложение самосопряженной матрицы \( A \) такое, что: \( A = Q T Q^* \), где \( Q \) — унитарная, а \( T \) — вещественная симметричная тридиагональная матрица.

Тридиагональная матрица — это матрица, у которой ненулевые элементы находятся только на главной диагонали и на первой диагонали ниже и выше неё. Разложение Хессенберга самосопряженной матрицы фактически является тридиагональным разложением. Этот класс используется в SelfAdjointEigenSolver для вычисления собственных значений и собственных векторов самосопряженной матрицы.

Вызовите функцию compute() для вычисления тридиагонального разложения заданной матрицы. В качестве альтернативы можно использовать конструктор Tridiagonalization(const MatrixType&), который вычисляет тридиагональное разложение Шура во время создания. После вычисления разложения можно использовать функции matrixQ() и matrixT() для получения матриц Q и T в разложении.

Документация Tridiagonalization(const MatrixType&) содержит пример типичного использования этого класса.

См. также
класс HessenbergDecomposition, класс SelfAdjointEigenSolver
typedef HouseholderSequence< MatrixType, typename internal::remove_all< typename CoeffVectorType::ConjugateReturnType >::type > HouseholderSequenceType
Тип возвращаемого значения matrixQ()
typedef Eigen::Index Index
typedef _MatrixType MatrixType
Синоним для параметра шаблона _MatrixType.
template<typename InputType >
Tridiagonalization & compute (const EigenBase< InputType > &matrix)
Вычисляет тридиагональное разложение заданной матрицы. Подробнее...
DiagonalReturnType diagonal () const
Возвращает диагональ тридиагональной матрицы T в разложении. Подробнее...
CoeffVectorType householderCoefficients () const
Возвращает коэффициенты Хаусхолдера. Подробнее...
HouseholderSequenceType matrixQ () const
Возвращает унитарную матрицу Q в разложении. Подробнее...
MatrixTReturnType matrixT () const
Возвращает выражение тридиагональной матрицы T в разложении. Подробнее...
const MatrixType & packedMatrix () const
Возвращает внутреннее представление разложения. Подробнее...
SubDiagonalReturnType subDiagonal () const
Возвращает субдиагональ тридиагональной матрицы T в разложении. Подробнее...
template<typename InputType >
Tridiagonalization (const EigenBase< InputType > &matrix)
Конструктор; вычисляет тридиагональное разложение заданной матрицы. Подробнее...
Tridiagonalization (Index size=Size==Dynamic ? 2 :Size)
Конструктор по умолчанию. Подробнее...

Index

template<typename _MatrixType >
typedef Eigen::Index Eigen::Tridiagonalization< _MatrixType >::Index
Устарело:
начиная с Eigen 3.3

Tridiagonalization() [1/2]

template<typename _MatrixType >
Eigen::Tridiagonalization< _MatrixType >::Tridiagonalization ( Index size = Size==Dynamic ? 2 : Size )
inlineexplicit

Конструктор по умолчанию.

Параметры
[вход] size Положительное целое число, размер матрицы, для которой будет вычислено тридиагональное разложение.

Конструктор по умолчанию полезен в случаях, когда пользователь намеревается выполнять разложения с помощью compute(). Параметр size используется только в качестве подсказки. Не является ошибкой указать неверный size, но это может снизить производительность.

См. также
compute() для примера.

Tridiagonalization() [2/2]

template<typename _MatrixType >
template<typename InputType >
Eigen::Tridiagonalization< _MatrixType >::Tridiagonalization ( const EigenBase< InputType > & matrix )
inlineexplicit

Конструктор; вычисляет тридиагональное разложение заданной матрицы.

Параметры
[вход] matrix Самосопряженная матрица, тридиагональное разложение которой необходимо вычислить.

Этот конструктор вызывает compute() для вычисления тридиагонального разложения.

Пример:

MatrixXd X = MatrixXd::Random(5,5);
MatrixXd A = X + X.transpose();
cout << "Here is a random symmetric 5x5 matrix:" << endl << A << endl << endl;
Tridiagonalization<MatrixXd> triOfA(A);
MatrixXd Q = triOfA.matrixQ();
cout << "The orthogonal matrix Q is:" << endl << Q << endl;
MatrixXd T = triOfA.matrixT();
cout << "The tridiagonal matrix T is:" << endl << T << endl << endl;
cout << "Q * T * Q^T = " << endl << Q * T * Q.transpose() << endl;

Вывод:

Here is a random symmetric 5x5 matrix:
  1.36 -0.816  0.521   1.43 -0.144
-0.816 -0.659  0.794 -0.173 -0.406
 0.521  0.794 -0.541  0.461  0.179
  1.43 -0.173  0.461  -1.43  0.822
-0.144 -0.406  0.179  0.822  -1.37

The orthogonal matrix Q is:
       1        0        0        0        0
       0   -0.471    0.127   -0.671   -0.558
       0    0.301   -0.195    0.437   -0.825
       0    0.825   0.0459   -0.563 -0.00872
       0  -0.0832   -0.971   -0.202   0.0922
The tridiagonal matrix T is:
  1.36   1.73      0      0      0
  1.73   -1.2 -0.966      0      0
     0 -0.966  -1.28  0.214      0
     0      0  0.214  -1.69  0.345
     0      0      0  0.345  0.164

Q * T * Q^T = 
  1.36 -0.816  0.521   1.43 -0.144
-0.816 -0.659  0.794 -0.173 -0.406
 0.521  0.794 -0.541  0.461  0.179
  1.43 -0.173  0.461  -1.43  0.822
-0.144 -0.406  0.179  0.822  -1.37

compute()

шаблон<typename _MatrixType >
шаблон<typename InputType >
РазложениеТрёхДиагональнойМатрицы& Eigen::РазложениеТрёхДиагональнойМатрицы< _MatrixType >::вычислить ( const EigenBase< InputType > & matrix )
inline

Вычисляет разложение данной матрицы на тридиагональную.

Параметры
[in] matrix Симметричная матрица, для которой необходимо вычислить разложение на тридиагональную.
Возвращает
Ссылка на *this

Разложение вычисляется путём последовательного приведения столбцов матрицы к требуемой форме с помощью отражений Хаусхолдера. Стоимость вычислений составляет \( 4n^3/3 \) операций с плавающей точкой, где \( n \) обозначает размер заданной матрицы.

Этот метод использует уже выделенные данные в объекте РазложениеТрёхДиагональнойМатрицы, если размер матрицы не меняется.

Пример:

Tridiagonalization<MatrixXf> tri;
MatrixXf X = MatrixXf::Random(4,4);
MatrixXf A = X + X.transpose();
tri.compute(A);
cout << "The matrix T in the tridiagonal decomposition of A is: " << endl;
cout << tri.matrixT() << endl;
tri.compute(2*A); // re-use tri to compute eigenvalues of 2A
cout << "The matrix T in the tridiagonal decomposition of 2A is: " << endl;
cout << tri.matrixT() << endl;

Вывод:

The matrix T in the tridiagonal decomposition of A is: 
  1.36 -0.704      0      0
-0.704 0.0147   1.71      0
     0   1.71  0.856  0.641
     0      0  0.641 -0.506
The matrix T in the tridiagonal decomposition of 2A is: 
  2.72  -1.41      0      0
 -1.41 0.0294   3.43      0
     0   3.43   1.71   1.28
     0      0   1.28  -1.01

diagonal()

шаблон<typename MatrixType >
РазложениеТрёхДиагональнойМатрицы< MatrixType >::DiagonalReturnType Eigen::РазложениеТрёхДиагональнойМатрицы< MatrixType >::diagonal

Возвращает диагональ тридиагональной матрицы T в разложении.

Возвращает
выражение, представляющее диагональ T
Предварительное условие
До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.

Пример:

MatrixXcd X = MatrixXcd::Random(4,4);
MatrixXcd A = X + X.adjoint();
cout << "Here is a random self-adjoint 4x4 matrix:" << endl << A << endl << endl;
 
Tridiagonalization<MatrixXcd> triOfA(A);
MatrixXd T = triOfA.matrixT();
cout << "The tridiagonal matrix T is:" << endl << T << endl << endl;
 
cout << "We can also extract the diagonals of T directly ..." << endl;
VectorXd diag = triOfA.diagonal();
cout << "The diagonal is:" << endl << diag << endl; 
VectorXd subdiag = triOfA.subDiagonal();
cout << "The subdiagonal is:" << endl << subdiag << endl;

Вывод:

Here is a random self-adjoint 4x4 matrix:
    (-0.422,0)  (0.705,-1.01) (-0.17,-0.552) (0.338,-0.357)
  (0.705,1.01)      (0.515,0) (0.241,-0.446)   (0.05,-1.64)
 (-0.17,0.552)  (0.241,0.446)      (-1.03,0)  (0.0449,1.72)
 (0.338,0.357)    (0.05,1.64) (0.0449,-1.72)       (1.36,0)

The tridiagonal matrix T is:
-0.422  -1.45      0      0
 -1.45   1.01  -1.42      0
     0  -1.42    1.8   -1.2
     0      0   -1.2  -1.96

We can also extract the diagonals of T directly ...
The diagonal is:
-0.422
  1.01
   1.8
 -1.96
The subdiagonal is:
-1.45
-1.42
 -1.2
См. также
matrixT(), subDiagonal()

householderCoefficients()

шаблон<typename _MatrixType >
CoeffVectorType Eigen::РазложениеТрёхДиагональнойМатрицы< _MatrixType >::householderCoefficients ( ) const
inline

Возвращает коэффициенты Хаусхолдера.

Возвращает
ссылка на вектор коэффициентов Хаусхолдера
Предварительное условие
До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.

Коэффициенты Хаусхолдера позволяют восстановить матрицу \( Q \) в тридиагональном разложении из упакованных данных.

Пример:

Matrix4d X = Matrix4d::Random(4,4);
Matrix4d A = X + X.transpose();
cout << "Here is a random symmetric 4x4 matrix:" << endl << A << endl;
Tridiagonalization<Matrix4d> triOfA(A);
Vector3d hc = triOfA.householderCoefficients();
cout << "The vector of Householder coefficients is:" << endl << hc << endl;

Вывод:

Here is a random symmetric 4x4 matrix:
   1.36   0.612   0.122   0.326
  0.612   -1.21  -0.222   0.563
  0.122  -0.222 -0.0904    1.16
  0.326   0.563    1.16    1.66
The vector of Householder coefficients is:
1.87
1.24
   0
См. также
packedMatrix(), Модуль Хаусхолдера

matrixQ()

шаблон<typename _MatrixType >
HouseholderSequenceType Eigen::РазложениеТрёхДиагональнойМатрицы< _MatrixType >::matrixQ ( ) const
inline

Возвращает унитарную матрицу Q в разложении.

Возвращает
объект, представляющий матрицу Q
Предварительное условие
До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.

Этот метод возвращает лёгковесный объект класса-шаблона HouseholderSequence. Вы можете либо применить его непосредственно к матрице, либо преобразовать в матрицу типа MatrixType.

См. также
РазложениеТрёхДиагональнойМатрицы(const MatrixType&) для примера, matrixT(), класс HouseholderSequence

matrixT()

шаблон<typename _MatrixType >
MatrixTReturnType Eigen::РазложениеТрёхДиагональнойМатрицы< _MatrixType >::matrixT ( ) const
inline

Возвращает выражение тридиагональной матрицы T в разложении.

Возвращает
объект выражения, представляющий матрицу T
Предварительное условие
До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.

В настоящее время этот метод может использоваться для извлечения матрицы T из внутренних данных и копирования её в объект матрицы с плотной памятью. В большинстве случаев может быть достаточно непосредственно использовать упакованную матрицу или векторные выражения, возвращаемые diagonal() и subDiagonal() вместо создания новой копии матрицы с плотной памятью с помощью этого метода.

См. также
РазложениеТрёхДиагональнойМатрицы(const MatrixType&) для примера, matrixQ(), packedMatrix(), diagonal(), subDiagonal()

packedMatrix()

шаблон<typename _MatrixType >
const MatrixType& Eigen::РазложениеТрёхДиагональнойМатрицы< _MatrixType >::packedMatrix ( ) const
inline

Возвращает внутреннее представление разложения.

Возвращает
ссылка на матрицу с внутренним представлением разложения.
Предварительное условие
До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.

Возвращаемая матрица содержит следующую информацию:

  • строго верхняя треугольная часть равна входной матрице A.
  • диагональ и нижняя поддиагональ представляют реальную тридиагональную симметричную матрицу T.
  • остальная часть нижней части содержит векторы Хаусхолдера, которые в сочетании с коэффициентами Хаусхолдера, возвращаемыми householderCoefficients(), позволяют восстановить матрицу Q как \( Q = H_{N-1} \ldots H_1 H_0 \). Здесь матрицы \( H_i \) являются преобразованиями Хаусхолдера \( H_i = (I - h_i v_i v_i^T) \), где \( h_i \) — \( i \)th коэффициент Хаусхолдера, а \( v_i \) — вектор Хаусхолдера, заданный \( v_i = [ 0, \ldots, 0, 1, M(i+2,i), \ldots, M(N-1,i) ]^T \), где M — матрица, возвращаемая этим методом.

См. LAPACK для получения дополнительной информации об этом упакованном хранилище.

Пример:

Matrix4d X = Matrix4d::Random(4,4);
Matrix4d A = X + X.transpose();
cout << "Here is a random symmetric 4x4 matrix:" << endl << A << endl;
Tridiagonalization<Matrix4d> triOfA(A);
Matrix4d pm = triOfA.packedMatrix();
cout << "The packed matrix M is:" << endl << pm << endl;
cout << "The diagonal and subdiagonal corresponds to the matrix T, which is:" 
     << endl << triOfA.matrixT() << endl;

Вывод:

Here is a random symmetric 4x4 matrix:
   1.36   0.612   0.122   0.326
  0.612   -1.21  -0.222   0.563
  0.122  -0.222 -0.0904    1.16
  0.326   0.563    1.16    1.66
The packed matrix M is:
  1.36  0.612  0.122  0.326
-0.704 0.0147 -0.222  0.563
0.0925   1.71  0.856   1.16
 0.248  0.785  0.641 -0.506
The diagonal and subdiagonal corresponds to the matrix T, which is:
  1.36 -0.704      0      0
-0.704 0.0147   1.71      0
     0   1.71  0.856  0.641
     0      0  0.641 -0.506
См. также
householderCoefficients()

subDiagonal()

шаблон<typename MatrixType >
РазложениеТрёхДиагональнойМатрицы< MatrixType >::SubDiagonalReturnType Eigen::РазложениеТрёхДиагональнойМатрицы< MatrixType >::subDiagonal

Возвращает поддиагональ тридиагональной матрицы T в разложении.

Возвращает
выражение, представляющее поддиагональ T
Предварительное условие
До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.
См. также
diagonal() для примера, matrixT()

Документация для этого класса была сгенерирована из следующего файла:
  • Tridiagonalization.h

© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1Tridiagonalization.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API