Eigen::RealSchur
template<typename _MatrixType>
class Eigen::RealSchur< _MatrixType >
Выполняет действительное разложение Шура квадратной матрицы.
Определено в модуле Eigenvalues.
#include <Eigen/Eigenvalues>
- Шаблонные параметры
-
_MatrixType тип матрицы, для которой вычисляется действительное разложение Шура; ожидается, что это будет экземпляр шаблона класса Matrix.
Для заданной вещественной квадратной матрицы A этот класс вычисляет действительное разложение Шура: \( A = U T U^T \), где U — вещественная ортогональная матрица, а T — вещественная квазитреугольная матрица. Ортогональная матрица — это матрица, обратная которой равна её транспонированной, \( U^{-1} = U^T \). Квазитреугольная матрица — это блочно-треугольная матрица, диагональ которой состоит из 1×1 блоков и 2×2 блоков с комплексными собственными значениями. Собственные значения блоков на диагонали T совпадают с собственными значениями матрицы A, и поэтому действительное разложение Шура используется в EigenSolver для вычисления собственного разложения матрицы.
Вызовите функцию compute() для вычисления действительного разложения Шура заданной матрицы. Альтернативно, можно использовать конструктор RealSchur(const MatrixType&, bool), который вычисляет действительное разложение Шура во время создания. После вычисления разложения можно использовать функции matrixU() и matrixT() для получения матриц U и T в разложении.
Документация RealSchur(const MatrixType&, bool) содержит пример типичного использования этого класса.
- Примечание
- Реализация адаптирована из JAMA (общественное достояние). Их код основан на EISPACK.
- См. также
- класс ComplexSchur, класс EigenSolver, класс ComplexEigenSolver
| typedef Eigen::Index | Index |
| template<typename InputType > | |
| RealSchur & | compute (const EigenBase< InputType > &matrix, bool computeU=true) |
| Вычисляет разложение Шура заданной матрицы. Подробнее... |
|
| template<typename HessMatrixType , typename OrthMatrixType > | |
| RealSchur & | computeFromHessenberg (const HessMatrixType &matrixH, const OrthMatrixType &matrixQ, bool computeU) |
| Вычисляет разложение Шура матрицы Хессенберга H = Z T Z^T. Подробнее... |
|
| Index | getMaxIterations () |
| Возвращает максимальное число итераций. |
|
| ComputationInfo | info () const |
| Сообщает, была ли успешной предыдущая вычисление. Подробнее... |
|
| const MatrixType & | matrixT () const |
| Возвращает квазитреугольную матрицу в разложении Шура. Подробнее... |
|
| const MatrixType & | matrixU () const |
| Возвращает ортогональную матрицу в разложении Шура. Подробнее... |
|
| template<typename InputType > | |
| RealSchur (const EigenBase< InputType > &matrix, bool computeU=true) | |
| Конструктор; вычисляет действительное разложение Шура заданной матрицы. Подробнее... |
|
| RealSchur (Index size=RowsAtCompileTime==Dynamic ? 1 :RowsAtCompileTime) | |
| Конструктор по умолчанию. Подробнее... |
|
| RealSchur & | setMaxIterations (Index maxIters) |
| Устанавливает максимальное количество разрешённых итераций. Подробнее... |
|
| static const int | m_maxIterationsPerRow |
| Максимальное количество итераций на строку. Подробнее... |
|
Index
| typedef Eigen::Index Eigen::RealSchur< _MatrixType >::Index |
RealSchur() [1/2]
| inlineexplicit |
Конструктор по умолчанию.
- Параметры
-
[вход] size Положительное целое число, размер матрицы, для которой будет вычислено разложение Шура.
Конструктор по умолчанию полезен в случаях, когда пользователь намерен выполнять разложения с помощью compute(). Параметр size используется только в качестве подсказки. Не является ошибкой указать неправильный size, но это может ухудшить производительность.
- См. также
- compute() для примера.
RealSchur() [2/2]
| inlineexplicit |
Конструктор; вычисляет действительное разложение Шура заданной матрицы.
- Параметры
-
[вход] matrix Квадратная матрица, для которой нужно вычислить разложение Шура. [вход] computeU Если true, вычисляются как T, так и U; если false, вычисляется только T.
Этот конструктор вызывает compute() для вычисления разложения Шура.
Пример:
MatrixXd A = MatrixXd::Random(6,6); cout << "Here is a random 6x6 matrix, A:" << endl << A << endl << endl; RealSchur<MatrixXd> schur(A); cout << "The orthogonal matrix U is:" << endl << schur.matrixU() << endl; cout << "The quasi-triangular matrix T is:" << endl << schur.matrixT() << endl << endl; MatrixXd U = schur.matrixU(); MatrixXd T = schur.matrixT(); cout << "U * T * U^T = " << endl << U * T * U.transpose() << endl;
Вывод:
Here is a random 6x6 matrix, A:
0.68 -0.33 -0.27 -0.717 -0.687 0.0259
-0.211 0.536 0.0268 0.214 -0.198 0.678
0.566 -0.444 0.904 -0.967 -0.74 0.225
0.597 0.108 0.832 -0.514 -0.782 -0.408
0.823 -0.0452 0.271 -0.726 0.998 0.275
-0.605 0.258 0.435 0.608 -0.563 0.0486
The orthogonal matrix U is:
0.348 -0.754 0.00435 -0.351 0.0146 0.432
-0.16 -0.266 -0.747 0.457 -0.366 0.0571
0.505 -0.157 0.0746 0.644 0.518 -0.177
0.703 0.324 -0.409 -0.349 -0.187 -0.275
0.296 0.372 0.24 0.324 -0.379 0.684
-0.126 0.305 -0.46 -0.161 0.647 0.485
The quasi-triangular matrix T is:
-0.2 -1.83 0.864 0.271 1.09 0.139
0.647 0.298 -0.0536 0.676 -0.288 0.0231
0 0 0.967 -0.201 -0.429 0.847
0 0 0 0.353 0.603 0.694
0 0 0 0 0.572 -1.03
0 0 0 0 0.0184 0.664
U * T * U^T =
0.68 -0.33 -0.27 -0.717 -0.687 0.0259
-0.211 0.536 0.0268 0.214 -0.198 0.678
0.566 -0.444 0.904 -0.967 -0.74 0.225
0.597 0.108 0.832 -0.514 -0.782 -0.408
0.823 -0.0452 0.271 -0.726 0.998 0.275
-0.605 0.258 0.435 0.608 -0.563 0.0486
compute()
| RealSchur& Eigen::RealSchur< _MatrixType >::compute | ( | const EigenBase< InputType > & | matrix, |
| bool |
computeU = true | ||
| ) |
Вычисляет разложение Шура данной матрицы.
- Параметры
-
[in] matrix Квадратная матрица, для которой требуется вычислить разложение Шура. [in] computeU Если true, вычисляются как T, так и U; если false, вычисляется только T.
- Возвращает
- Ссылка на
*this
Разложение Шура вычисляется путем предварительного сведения матрицы к форме Хессенберга с помощью класса HessenbergDecomposition. Затем матрица Хессенберга сводится к треугольной форме путем выполнения итераций Фрэнсиса QR с неявным двойным сдвигом. Стоимость вычисления разложения Шура зависит от количества итераций; в качестве ориентировочного значения можно принять \(25n^3\) операций с плавающей точкой, если computeU равно true, и \(10n^3\) операций, если computeU равно false.
Пример:
MatrixXf A = MatrixXf::Random(4,4); RealSchur<MatrixXf> schur(4); schur.compute(A, /* computeU = */ false); cout << "The matrix T in the decomposition of A is:" << endl << schur.matrixT() << endl; schur.compute(A.inverse(), /* computeU = */ false); cout << "The matrix T in the decomposition of A^(-1) is:" << endl << schur.matrixT() << endl;
Вывод:
The matrix T in the decomposition of A is:
0.523 -0.698 0.148 0.742
0.475 0.986 -0.793 0.721
0 0 -0.28 -0.77
0 0 0.0145 -0.367
The matrix T in the decomposition of A^(-1) is:
-3.06 -4.57 -5.97 5.48
0.168 -2.62 -3.27 3.9
0 0 0.427 0.573
0 0 -1.05 1.35
- См. также
- compute(const MatrixType&, bool, Index)
computeFromHessenberg()
| RealSchur& Eigen::RealSchur< _MatrixType >::computeFromHessenberg | ( | const HessMatrixType & | matrixH, |
| const OrthMatrixType & | matrixQ, | ||
| bool | computeU | ||
| ) |
Вычисляет разложение Шура матрицы Хессенберга H = Z T Z^T.
- Параметры
-
[in] matrixH Матрица в форме Хессенберга H [in] matrixQ ортогональная матрица Q, которая преобразует матрицу A к H: A = Q H Q^T computeU Вычисляет матрицу U собственных векторов Шура
- Возвращает
- Ссылка на
*this
Эта функция предполагает, что матрица уже сведена к форме Хессенберга matrixH, например, с помощью класса HessenbergDecomposition или другим способом. Она вычисляет верхнетреугольную квазиматрицу T разложения Шура H. При computeU=true эта функция вычисляет матрицу U, такую что A = U T U^T = (QZ) T (QZ)^T = Q H Q^T, где A - исходная матрица.
ПРИМЕЧАНИЕ. Q используется, если computeU=true; поэтому, если исходная ортогональная матрица недоступна, пользователь должен указать единичную матрицу (Q.setIdentity()).
- См. также
- compute(const MatrixType&, bool)
info()
| inline |
Сообщает, был ли успешен предыдущий расчет.
- Возвращает
-
Successесли вычисление было успешным,NoConvergenceв противном случае.
matrixT()
| inline |
Возвращает квазитреугольную матрицу в разложении Шура.
- Возвращает
- Константная ссылка на матрицу T.
- Предварительное условие
- До вызова конструктора RealSchur(const MatrixType&, bool) или члена compute(const MatrixType&, bool) для вычисления разложения Шура матрицы.
- См. также
- RealSchur(const MatrixType&, bool) для примера
matrixU()
| inline |
Возвращает ортогональную матрицу в разложении Шура.
- Возвращает
- Константная ссылка на матрицу U.
- Предварительное условие
- До вызова конструктора RealSchur(const MatrixType&, bool) или члена compute(const MatrixType&, bool) для вычисления разложения Шура матрицы, и
computeUбыло установлено в значение true (значение по умолчанию).
- См. также
- RealSchur(const MatrixType&, bool) для примера
setMaxIterations()
| inline |
Устанавливает максимальное количество итераций.
Если не указано пользователем, максимальное количество итераций равно m_maxIterationsPerRow, умноженному на размер матрицы.
m_maxIterationsPerRow
| static |
Максимальное количество итераций на строку.
Если не указано иначе, максимальное количество итераций равно этому числу, умноженному на размер матрицы. В настоящее время установлено значение 40.
The documentation for this class was generated from the following file:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1RealSchur.html