Eigen::SelfAdjointEigenSolver
template<typename _MatrixType>
class Eigen::SelfAdjointEigenSolver< _MatrixType >
Вычисляет собственные значения и собственные векторы эрмитовых матриц.
Определено в модуле собственных значений.
#include <Eigen/Eigenvalues>
- Параметры шаблона
-
_MatrixType тип матрицы, для которой вычисляется собственное разложение; ожидается, что это будет экземпляр шаблона класса Matrix.
Матрица \( A \) является эрмитовой, если она равна своему сопряжению. Для вещественных матриц это означает, что матрица симметрична: она равна своей транспонированной. Этот класс вычисляет собственные значения и собственные векторы эрмитовой матрицы. Это скаляры \( \lambda \) и векторы \( v \) такие, что \( Av = \lambda v \). Собственные значения эрмитовой матрицы всегда вещественные. Если \( D \) — диагональная матрица с собственными значениями на диагонали, а \( V \) — матрица с собственными векторами в качестве столбцов, то \( A = V D V^{-1} \). Это называется собственным разложением.
Для эрмитовой матрицы \( V \) является унитарной, т. е. её обратная матрица равна её сопряжённой, \( V^{-1} = V^{\dagger} \). Если \( A \) вещественная, то \( V \) также вещественная и, следовательно, ортогональная, т. е. её обратная матрица равна её транспонированной, \( V^{-1} = V^T \).
Алгоритм использует тот факт, что матрица эрмитова, что делает его быстрее и точнее, чем общие алгоритмы вычисления собственных значений, реализованные в EigenSolver и ComplexEigenSolver.
Используется только нижняя треугольная часть входной матрицы.
Вызовите функцию compute() для вычисления собственных значений и собственных векторов данной матрицы. Кроме того, вы можете использовать конструктор SelfAdjointEigenSolver(const MatrixType&, int), который вычисляет собственные значения и собственные векторы во время создания. После вычисления собственных значений и собственных векторов их можно получить с помощью функций eigenvalues() и eigenvectors().
Документация для SelfAdjointEigenSolver(const MatrixType&, int) содержит пример типичного использования этого класса.
Для решения обобщённой задачи на собственные значения \( Av = \lambda Bv \) и аналогичных задач, см. класс GeneralizedSelfAdjointEigenSolver.
- См. также
- MatrixBase::eigenvalues(), класс EigenSolver, класс ComplexEigenSolver
| typedef Eigen::Index | Index |
| typedef NumTraits< Scalar >::Real | RealScalar |
Тип вещественного скаляра для _MatrixType. Подробнее... |
|
| typedef internal::plain_col_type< MatrixType, RealScalar >::type | RealVectorType |
| Тип для вектора собственных значений, возвращаемого функцией eigenvalues(). Подробнее... |
|
| typedef MatrixType::Scalar | Scalar |
Тип скаляра для матриц типа _MatrixType. |
|
| template<typename InputType > | |
| SelfAdjointEigenSolver & | compute (const EigenBase< InputType > &matrix, int options=ComputeEigenvectors) |
| Вычисляет собственное разложение заданной матрицы. Подробнее... |
|
| SelfAdjointEigenSolver & | computeDirect (const MatrixType &matrix, int options=ComputeEigenvectors) |
| Вычисляет собственное разложение заданной матрицы с помощью замкнутого алгоритма. Подробнее... |
|
| SelfAdjointEigenSolver & | computeFromTridiagonal (const RealVectorType &diag, const SubDiagonalType &subdiag, int options=ComputeEigenvectors) |
| Вычисляет собственное разложение из тридиагональной симметричной матрицы. Подробнее... |
|
| const RealVectorType & | eigenvalues () const |
| Возвращает собственные значения заданной матрицы. Подробнее... |
|
| const EigenvectorsType & | eigenvectors () const |
| Возвращает собственные векторы заданной матрицы. Подробнее... |
|
| ComputationInfo | info () const |
| Сообщает, был ли предыдущий вычисление успешным. Подробнее... |
|
| MatrixType | operatorInverseSqrt () const |
| Вычисляет обратный квадратный корень матрицы. Подробнее... |
|
| MatrixType | operatorSqrt () const |
| Вычисляет положительно определённый квадратный корень матрицы. Подробнее... |
|
| SelfAdjointEigenSolver () | |
| Конструктор по умолчанию для матриц фиксированного размера. Подробнее... |
|
| template<typename InputType > | |
| SelfAdjointEigenSolver (const EigenBase< InputType > &matrix, int options=ComputeEigenvectors) | |
| Конструктор; вычисляет собственное разложение заданной матрицы. Подробнее... |
|
| SelfAdjointEigenSolver (Index size) | |
| Конструктор; предварительно выделяет память для динамических матриц. Подробнее... |
|
| static const int | m_maxIterations |
| Максимальное число итераций. Подробнее... |
|
Index
| typedef Eigen::Index Eigen::SelfAdjointEigenSolver< _MatrixType >::Index |
- Устаревшее:
- с Eigen 3.3
RealScalar
| typedef NumTraits<Scalar>::Real Eigen::SelfAdjointEigenSolver< _MatrixType >::RealScalar |
RealVectorType
| typedef internal::plain_col_type<MatrixType, RealScalar>::type Eigen::SelfAdjointEigenSolver< _MatrixType >::RealVectorType |
Тип для вектора собственных значений, возвращаемого eigenvalues().
Это столбец со значениями типа RealScalar. Длина вектора равна размеру _MatrixType.
SelfAdjointEigenSolver() [1/3]
| inline |
Конструктор по умолчанию для матриц фиксированного размера.
Конструктор по умолчанию полезен в тех случаях, когда пользователь намерен выполнять разложения через compute(). Этот конструктор может быть использован только если _MatrixType является матрицей фиксированного размера; используйте SelfAdjointEigenSolver(Index) для матриц динамического размера.
Пример:
SelfAdjointEigenSolver<Matrix4f> es; Matrix4f X = Matrix4f::Random(4,4); Matrix4f A = X + X.transpose(); es.compute(A); cout << "The eigenvalues of A are: " << es.eigenvalues().transpose() << endl; es.compute(A + Matrix4f::Identity(4,4)); // re-use es to compute eigenvalues of A+I cout << "The eigenvalues of A+I are: " << es.eigenvalues().transpose() << endl;
Вывод:
The eigenvalues of A are: -1.58 -0.473 1.32 2.46 The eigenvalues of A+I are: -0.581 0.527 2.32 3.46
SelfAdjointEigenSolver() [2/3]
| inlineexplicit |
Конструктор, предварительно выделяет память для матриц динамического размера.
- Параметры
-
[in] size Положительное целое число, размер матрицы, собственные значения и собственные векторы которой будут вычислены.
Этот конструктор полезен для матриц динамического размера, когда пользователь намерен выполнять разложения с помощью compute(). Параметр size используется только как подсказка. Неправильный size не является ошибкой, но может ухудшить производительность.
- См. также
- compute() для примера
SelfAdjointEigenSolver() [3/3]
| inlineexplicit |
Конструктор; вычисляет разложение собственных значений заданной матрицы.
- Параметры
-
[in] matrix Симметричная матрица, для которой требуется вычислить разложение собственных значений. Используется только нижняя треугольная часть матрицы. [in] options Может быть ComputeEigenvectors (по умолчанию) или EigenvaluesOnly.
Этот конструктор вызывает compute(const MatrixType&, int) для вычисления собственных значений матрицы matrix. Собственные векторы вычисляются, если options равно ComputeEigenvectors.
Пример:
MatrixXd X = MatrixXd::Random(5,5); MatrixXd A = X + X.transpose(); cout << "Here is a random symmetric 5x5 matrix, A:" << endl << A << endl << endl; SelfAdjointEigenSolver<MatrixXd> es(A); cout << "The eigenvalues of A are:" << endl << es.eigenvalues() << endl; cout << "The matrix of eigenvectors, V, is:" << endl << es.eigenvectors() << endl << endl; double lambda = es.eigenvalues()[0]; cout << "Consider the first eigenvalue, lambda = " << lambda << endl; VectorXd v = es.eigenvectors().col(0); cout << "If v is the corresponding eigenvector, then lambda * v = " << endl << lambda * v << endl; cout << "... and A * v = " << endl << A * v << endl << endl; MatrixXd D = es.eigenvalues().asDiagonal(); MatrixXd V = es.eigenvectors(); cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << endl;
Вывод:
Here is a random symmetric 5x5 matrix, A: 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 eigenvalues of A are: -2.65 -1.77 -0.745 0.227 2.29 The matrix of eigenvectors, V, is: -0.326 -0.0984 0.347 -0.0109 0.874 -0.207 -0.642 0.228 0.662 -0.232 0.0495 0.629 -0.164 0.74 0.164 0.721 -0.397 -0.402 0.115 0.385 -0.573 -0.156 -0.799 -0.0256 0.0858 Consider the first eigenvalue, lambda = -2.65 If v is the corresponding eigenvector, then lambda * v = 0.865 0.55 -0.131 -1.91 1.52 ... and A * v = 0.865 0.55 -0.131 -1.91 1.52 Finally, V * D * V^(-1) = 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(const MatrixType&, int)
compute()
| SelfAdjointEigenSolver& Eigen::SelfAdjointEigenSolver< _MatrixType >::compute | ( | const EigenBase< InputType > & | matrix, |
| int |
options = ComputeEigenvectors | ||
| ) |
Вычисляет разложение собственных значений заданной матрицы.
- Параметры
-
[in] matrix Симметричная матрица, для которой требуется вычислить разложение собственных значений. Используется только нижняя треугольная часть матрицы. [in] options Может быть ComputeEigenvectors (по умолчанию) или EigenvaluesOnly.
- Возвращает
- Ссылка на
*this
Эта функция вычисляет собственные значения matrix. Функцию eigenvalues() можно использовать для их получения. Если options равно ComputeEigenvectors, то собственные векторы также вычисляются и могут быть получены, вызвав eigenvectors().
Это реализация использует симметричный алгоритм QR. Матрица сначала сводится к трехдиагональной форме с использованием класса Tridiagonalization. Затем трехдиагональная матрица приводится к диагональной форме с помощью неявных симметричных QR-шагов с правилом Вилкинсона. Подробности можно найти в разделе 8.3 Golub & Van Loan, Matrix Computations.
Стоимость вычислений составляет примерно \( 9n^3 \), если требуются собственные векторы, и \( 4n^3/3 \), если они не требуются.
Этот метод повторно использует память в объекте SelfAdjointEigenSolver, который был выделен при создании объекта, если размер матрицы не изменяется.
Пример:
SelfAdjointEigenSolver<MatrixXf> es(4); MatrixXf X = MatrixXf::Random(4,4); MatrixXf A = X + X.transpose(); es.compute(A); cout << "The eigenvalues of A are: " << es.eigenvalues().transpose() << endl; es.compute(A + MatrixXf::Identity(4,4)); // re-use es to compute eigenvalues of A+I cout << "The eigenvalues of A+I are: " << es.eigenvalues().transpose() << endl;
Вывод:
The eigenvalues of A are: -1.58 -0.473 1.32 2.46 The eigenvalues of A+I are: -0.581 0.527 2.32 3.46
- См. также
- SelfAdjointEigenSolver(const MatrixType&, int)
computeDirect()
| SelfAdjointEigenSolver< MatrixType > & Eigen::SelfAdjointEigenSolver< MatrixType >::computeDirect | ( | const MatrixType & | matrix, |
| int |
options = ComputeEigenvectors | ||
| ) |
Вычисляет разложение собственных значений заданной матрицы с помощью алгоритма с замкнутой формой.
Это вариант compute(const MatrixType&, int options), который напрямую решает основное полиномиальное уравнение.
В настоящее время поддерживаются только матрицы 2x2 и 3x3, размеры которых известны на этапе компиляции (например, Matrix3d).
Этот метод обычно значительно быстрее, чем итеративный алгоритм QR, но также может быть менее точным. Также стоит отметить, что для матриц 3x3 он включает тригонометрические операции, которые не обязательно доступны для всех типов скаляров.
Для случая 3x3 мы наблюдали следующие относительные погрешности собственных значений в худшем случае:
- double: 1e-8
- float: 1e-3
- См. также
- compute(const MatrixType&, int options)
computeFromTridiagonal()
| SelfAdjointEigenSolver< MatrixType > & Eigen::SelfAdjointEigenSolver< MatrixType >::computeFromTridiagonal | ( | const RealVectorType & | diag, |
| const SubDiagonalType & | subdiag, | ||
| int |
options = ComputeEigenvectors | ||
| ) |
Вычисляет разложение собственных значений из трехдиагональной симметричной матрицы.
- Параметры
-
[in] diag Вектор, содержащий диагональ матрицы. [in] subdiag Поддиагональ матрицы. [in] options Может быть ComputeEigenvectors (по умолчанию) или EigenvaluesOnly.
- Возвращает
- Ссылка на
*this
Эта функция предполагает, что матрица была сведена к трехдиагональной форме.
- См. также
- compute(const MatrixType&, int) для получения дополнительной информации
eigenvalues()
| inline |
Возвращает собственные значения заданной матрицы.
- Возвращает
- Ссылка на вектор-столбец, содержащий собственные значения.
- Предпосылка
- Собственные значения были вычислены ранее.
Собственные значения повторяются в соответствии с их алгебраической кратностью, поэтому их количество равно числу строк в матрице. Собственные значения отсортированы в порядке возрастания.
Пример:
MatrixXd ones = MatrixXd::Ones(3,3); SelfAdjointEigenSolver<MatrixXd> es(ones); cout << "The eigenvalues of the 3x3 matrix of ones are:" << endl << es.eigenvalues() << endl;
Вывод:
The eigenvalues of the 3x3 matrix of ones are:
-3.09e-16
0
3
- См. также
- eigenvectors(), MatrixBase::eigenvalues()
eigenvectors()
| inline |
Возвращает собственные векторы заданной матрицы.
- Возвращает
- Постоянную ссылку на матрицу, столбцы которой являются собственными векторами.
- Предварительное условие
- Собственные векторы были вычислены ранее.
Столбец \( k \) возвращаемой матрицы представляет собой собственный вектор, соответствующий собственному значению с номером \( k \), как возвращается функцией eigenvalues(). Собственные векторы нормированы таким образом, что их (евклидова) норма равна единице. Если этот объект был использован для решения собственной задачи для самосопряжённой матрицы \( A \), то матрица, возвращаемая этой функцией, является матрицей \( V \) в разложении по собственным значениям \( A = V D V^{-1} \).
Для самосопряжённой матрицы \( V \) является унитарной, что означает, что её обратная равна её сопряжённой, \( V^{-1} = V^{\dagger} \). Если \( A \) вещественная, то \( V \) также вещественная и, следовательно, ортогональная, что означает, что её обратная равна её транспонированной, \( V^{-1} = V^T \).
Пример:
MatrixXd ones = MatrixXd::Ones(3,3); SelfAdjointEigenSolver<MatrixXd> es(ones); cout << "The first eigenvector of the 3x3 matrix of ones is:" << endl << es.eigenvectors().col(0) << endl;
Вывод:
The first eigenvector of the 3x3 matrix of ones is: -0.816 0.408 0.408
- См. также
- eigenvalues()
info()
| inline |
Сообщает, была ли предыдущая вычисление успешной.
- Возвращает
-
Successесли вычисление прошло успешно,NoConvergenceв противном случае.
operatorInverseSqrt()
| inline |
Вычисляет обратный квадратный корень матрицы.
- Возвращает
- обратный положительно определённый квадратный корень матрицы
- Предварительное условие
- Собственные значения и собственные векторы положительно определённой матрицы были вычислены ранее.
Эта функция использует собственное разложение \( A = V D V^{-1} \) для вычисления обратного квадратного корня как \( V D^{-1/2} V^{-1} \). Это дешевле, чем сначала вычислить квадратный корень с помощью operatorSqrt(), а затем её обратную с помощью MatrixBase::inverse().
Пример:
MatrixXd X = MatrixXd::Random(4,4); MatrixXd A = X * X.transpose(); cout << "Here is a random positive-definite matrix, A:" << endl << A << endl << endl; SelfAdjointEigenSolver<MatrixXd> es(A); cout << "The inverse square root of A is: " << endl; cout << es.operatorInverseSqrt() << endl; cout << "We can also compute it with operatorSqrt() and inverse(). That yields: " << endl; cout << es.operatorSqrt().inverse() << endl;
Вывод:
Here is a random positive-definite matrix, A: 1.41 -0.697 -0.111 0.508 -0.697 0.423 0.0991 -0.4 -0.111 0.0991 1.25 0.902 0.508 -0.4 0.902 1.4 The inverse square root of A is: 1.88 2.78 -0.546 0.605 2.78 8.61 -2.3 2.74 -0.546 -2.3 1.92 -1.36 0.605 2.74 -1.36 2.18 We can also compute it with operatorSqrt() and inverse(). That yields: 1.88 2.78 -0.546 0.605 2.78 8.61 -2.3 2.74 -0.546 -2.3 1.92 -1.36 0.605 2.74 -1.36 2.18
operatorSqrt()
| inline |
Вычисляет положительно определённый квадратный корень матрицы.
- Возвращает
- положительно определённый квадратный корень матрицы
- Предварительное условие
- Собственные значения и собственные векторы положительно определённой матрицы были вычислены ранее.
Квадратный корень положительно определённой матрицы \( A \) — это положительно определённая матрица, квадрат которой равен \( A \). Эта функция использует собственное разложение \( A = V D V^{-1} \) для вычисления квадратного корня как \( A^{1/2} = V D^{1/2} V^{-1} \).
Пример:
MatrixXd X = MatrixXd::Random(4,4); MatrixXd A = X * X.transpose(); cout << "Here is a random positive-definite matrix, A:" << endl << A << endl << endl; SelfAdjointEigenSolver<MatrixXd> es(A); MatrixXd sqrtA = es.operatorSqrt(); cout << "The square root of A is: " << endl << sqrtA << endl; cout << "If we square this, we get: " << endl << sqrtA*sqrtA << endl;
Вывод:
Here is a random positive-definite matrix, A:
1.41 -0.697 -0.111 0.508
-0.697 0.423 0.0991 -0.4
-0.111 0.0991 1.25 0.902
0.508 -0.4 0.902 1.4
The square root of A is:
1.09 -0.432 -0.0685 0.2
-0.432 0.379 0.141 -0.269
-0.0685 0.141 1 0.468
0.2 -0.269 0.468 1.04
If we square this, we get:
1.41 -0.697 -0.111 0.508
-0.697 0.423 0.0991 -0.4
-0.111 0.0991 1.25 0.902
0.508 -0.4 0.902 1.4
- См. также
- operatorInverseSqrt(), Модуль матричных функций
m_maxIterations
| static |
Максимальное количество итераций.
Алгоритм завершается, если он не сходится в течение m_maxIterations * n итераций, где n обозначает размер матрицы. В настоящее время это значение установлено в 30 (скопировано из LAPACK).
The documentation for this class was generated from the following file:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1SelfAdjointEigenSolver.html