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
| typedef Eigen::Index Eigen::Tridiagonalization< _MatrixType >::Index |
Tridiagonalization() [1/2]
| inlineexplicit |
Конструктор по умолчанию.
- Параметры
-
[вход] size Положительное целое число, размер матрицы, для которой будет вычислено тридиагональное разложение.
Конструктор по умолчанию полезен в случаях, когда пользователь намеревается выполнять разложения с помощью compute(). Параметр size используется только в качестве подсказки. Не является ошибкой указать неверный size, но это может снизить производительность.
- См. также
- compute() для примера.
Tridiagonalization() [2/2]
| 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()
| 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()
| РазложениеТрёхДиагональнойМатрицы< 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()
| 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()
| inline |
Возвращает унитарную матрицу Q в разложении.
- Возвращает
- объект, представляющий матрицу Q
- Предварительное условие
- До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.
Этот метод возвращает лёгковесный объект класса-шаблона HouseholderSequence. Вы можете либо применить его непосредственно к матрице, либо преобразовать в матрицу типа MatrixType.
- См. также
- РазложениеТрёхДиагональнойМатрицы(const MatrixType&) для примера, matrixT(), класс HouseholderSequence
matrixT()
| inline |
Возвращает выражение тридиагональной матрицы T в разложении.
- Возвращает
- объект выражения, представляющий матрицу T
- Предварительное условие
- До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.
В настоящее время этот метод может использоваться для извлечения матрицы T из внутренних данных и копирования её в объект матрицы с плотной памятью. В большинстве случаев может быть достаточно непосредственно использовать упакованную матрицу или векторные выражения, возвращаемые diagonal() и subDiagonal() вместо создания новой копии матрицы с плотной памятью с помощью этого метода.
- См. также
- РазложениеТрёхДиагональнойМатрицы(const MatrixType&) для примера, matrixQ(), packedMatrix(), diagonal(), subDiagonal()
packedMatrix()
| 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()
| РазложениеТрёхДиагональнойМатрицы< MatrixType >::SubDiagonalReturnType Eigen::РазложениеТрёхДиагональнойМатрицы< MatrixType >::subDiagonal |
Возвращает поддиагональ тридиагональной матрицы T в разложении.
- Возвращает
- выражение, представляющее поддиагональ T
- Предварительное условие
- До вызова метода необходимо было вызвать конструктор Tridiagonalization(const MatrixType&) или member функцию compute(const MatrixType&) для вычисления тридиагонального разложения матрицы.
- См. также
- diagonal() для примера, matrixT()
Документация для этого класса была сгенерирована из следующего файла:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1Tridiagonalization.html