Eigen::EigenSolver
template<typename _MatrixType>
class Eigen::EigenSolver< _MatrixType >
Вычисляет собственные значения и собственные векторы общих матриц.
Определено в модуле собственных значений.
#include <Eigen/Eigenvalues>
- Шаблонные параметры
-
_MatrixType тип матрицы, для которой вычисляется собственное разложение; ожидается, что это будет экземпляр шаблона класса Matrix. В настоящее время поддерживаются только вещественные матрицы.
Собственные значения и собственные векторы матрицы \( A \) — это скаляры \( \lambda \) и векторы \( v \) такие, что \( Av = \lambda v \). Если \( D \) — диагональная матрица с собственными значениями на диагонали, а \( V \) — матрица с собственными векторами в качестве столбцов, то \( A V = V D \). Матрица \( V \) почти всегда обратима, в этом случае у нас \( A = V D V^{-1} \). Это называется собственным разложением.
Собственные значения и собственные векторы матрицы могут быть комплексными, даже если матрица вещественная. Однако мы можем выбрать вещественные матрицы \( V \) и \( D \) удовлетворяющие \( A V = V D \), точно так же, как при собственном разложении, если матрица \( D \) не обязана быть диагональной, но если ей разрешено иметь блоки вида
\[ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \]
(где \( u \) и \( v \) — вещественные числа) на диагонали. Эти блоки соответствуют парам комплексных собственных значений \( u \pm iv \). Мы называем эту вариацию собственного разложения псевдо-собственным разложением.
Вызовите функцию compute(), чтобы вычислить собственные значения и собственные векторы заданной матрицы. В качестве альтернативы вы можете использовать конструктор EigenSolver(const MatrixType&, bool), который вычисляет собственные значения и собственные векторы во время создания. После вычисления собственных значений и собственных векторов их можно получить с помощью функций eigenvalues() и eigenvectors(). Методы pseudoEigenvalueMatrix() и pseudoEigenvectors() позволяют построить псевдо-собственное разложение.
Документация для EigenSolver(const MatrixType&, bool) содержит пример типичного использования этого класса.
- Примечание
- Реализация адаптирована из JAMA (общественное достояние). Их код основан на EISPACK.
- См. также
- MatrixBase::eigenvalues(), класс ComplexEigenSolver, класс SelfAdjointEigenSolver
| typedef std::complex< RealScalar > | ComplexScalar |
| Тип комплексного скаляра для MatrixType. Подробнее... |
|
| typedef Matrix< ComplexScalar, ColsAtCompileTime, 1, Options &~RowMajor, MaxColsAtCompileTime, 1 > | EigenvalueType |
| Тип для вектора собственных значений, возвращаемого eigenvalues(). Подробнее... |
|
| typedef Matrix< ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime > | EigenvectorsType |
| Тип для матрицы собственных векторов, возвращаемой eigenvectors(). Подробнее... |
|
| typedef Eigen::Index | Index |
| typedef _MatrixType | MatrixType |
Синоним для шаблонного параметра _MatrixType. |
|
| typedef MatrixType::Scalar | Scalar |
| Тип скаляра для матриц типа MatrixType. |
|
| template<typename InputType > | |
| EigenSolver & | compute (const EigenBase< InputType > &matrix, bool computeEigenvectors=true) |
| Вычисляет собственное разложение заданной матрицы. Подробнее... |
|
| EigenSolver () | |
| Конструктор по умолчанию. Подробнее... |
|
| template<typename InputType > | |
| EigenSolver (const EigenBase< InputType > &matrix, bool computeEigenvectors=true) | |
| Конструктор; вычисляет собственное разложение заданной матрицы. Подробнее... |
|
| EigenSolver (Index size) | |
| Конструктор по умолчанию с предварительной выделением памяти. Подробнее... |
|
| const EigenvalueType & | eigenvalues () const |
| Возвращает собственные значения заданной матрицы. Подробнее... |
|
| EigenvectorsType | eigenvectors () const |
| Возвращает собственные векторы заданной матрицы. Подробнее... |
|
| Index | getMaxIterations () |
| Возвращает максимальное число итераций. |
|
| ComputationInfo | info () const |
| MatrixType | pseudoEigenvalueMatrix () const |
| Возвращает диагональную матрицу в псевдо-собственном разложении. Подробнее... |
|
| const MatrixType & | pseudoEigenvectors () const |
| Возвращает псевдо-собственные векторы заданной матрицы. Подробнее... |
|
| EigenSolver & | setMaxIterations (Index maxIters) |
| Устанавливает максимальное количество разрешенных итераций. |
|
ComplexScalar
| typedef std::complex<RealScalar> Eigen::EigenSolver< _MatrixType >::ComplexScalar |
Тип комплексного скаляра для MatrixType.
Это std::complex<Scalar> если Scalar вещественный (например, float или double) и просто Scalar если Scalar комплексный.
EigenvalueType
| typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> Eigen::EigenSolver< _MatrixType >::EigenvalueType |
Тип для вектора собственных значений, возвращаемого методом eigenvalues().
Это столбец с элементами типа ComplexScalar. Длина вектора равна размеру MatrixType.
EigenvectorsType
| typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> Eigen::EigenSolver< _MatrixType >::EigenvectorsType |
Тип для матрицы собственных векторов, возвращаемой методом eigenvectors().
Это квадратная матрица с элементами типа ComplexScalar. Размер совпадает с размером MatrixType.
Index
| typedef Eigen::Index Eigen::EigenSolver< _MatrixType >::Index |
- Устаревшее:
- с Eigen 3.3
EigenSolver() [1/3]
| inline |
Конструктор по умолчанию.
Конструктор по умолчанию полезен в тех случаях, когда пользователь намерен выполнять разложения с помощью EigenSolver::compute(const MatrixType&, bool).
- См. также
- compute() для примера.
EigenSolver() [2/3]
| inlineexplicit |
Конструктор по умолчанию с предварительной выделением памяти.
Аналогично конструктору по умолчанию, но с предварительным выделением внутренней памяти в соответствии с указанным size проблемы.
- См. также
- EigenSolver()
EigenSolver() [3/3]
| inlineexplicit |
Конструктор; вычисляет собственное разложение заданной матрицы.
- Параметры
-
[вход] matrix Квадратная матрица, для которой необходимо вычислить собственное разложение. [вход] computeEigenvectors Если true, вычисляются и собственные векторы, и собственные значения; если false, вычисляются только собственные значения.
Этот конструктор вызывает compute() для вычисления собственных значений и собственных векторов.
Пример:
MatrixXd A = MatrixXd::Random(6,6); cout << "Here is a random 6x6 matrix, A:" << endl << A << endl << endl; EigenSolver<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; complex<double> lambda = es.eigenvalues()[0]; cout << "Consider the first eigenvalue, lambda = " << lambda << endl; VectorXcd 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.cast<complex<double> >() * v << endl << endl; MatrixXcd D = es.eigenvalues().asDiagonal(); MatrixXcd V = es.eigenvectors(); cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << 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 eigenvalues of A are:
(0.049,1.06)
(0.049,-1.06)
(0.967,0)
(0.353,0)
(0.618,0.129)
(0.618,-0.129)
The matrix of eigenvectors, V, is:
(-0.292,-0.454) (-0.292,0.454) (-0.0607,0) (-0.733,0) (0.59,-0.121) (0.59,0.121)
(0.134,-0.104) (0.134,0.104) (-0.799,0) (0.136,0) (0.334,0.368) (0.334,-0.368)
(-0.422,-0.18) (-0.422,0.18) (0.192,0) (0.0563,0) (-0.335,-0.143) (-0.335,0.143)
(-0.589,0.0274) (-0.589,-0.0274) (-0.0788,0) (-0.627,0) (0.322,-0.155) (0.322,0.155)
(-0.248,0.132) (-0.248,-0.132) (0.401,0) (0.218,0) (-0.335,-0.0761) (-0.335,0.0761)
(0.105,0.18) (0.105,-0.18) (-0.392,0) (-0.00564,0) (-0.0324,0.103) (-0.0324,-0.103)
Consider the first eigenvalue, lambda = (0.049,1.06)
If v is the corresponding eigenvector, then lambda * v =
(0.466,-0.331)
(0.117,0.137)
(0.17,-0.456)
(-0.0578,-0.622)
(-0.152,-0.256)
(-0.186,0.12)
... and A * v =
(0.466,-0.331)
(0.117,0.137)
(0.17,-0.456)
(-0.0578,-0.622)
(-0.152,-0.256)
(-0.186,0.12)
Finally, V * D * V^(-1) =
(0.68,-4.44e-16) (-0.33,-5.55e-17) (-0.27,-1.11e-16) (-0.717,-4.44e-16) (-0.687,8.88e-16) (0.0259,0)
(-0.211,2.22e-16) (0.536,1.91e-17) (0.0268,0) (0.214,0) (-0.198,1.33e-15) (0.678,0)
(0.566,2.22e-16) (-0.444,-1.53e-16) (0.904,-2.22e-16) (-0.967,-1.11e-16) (-0.74,4.44e-16) (0.225,2.22e-16)
(0.597,-2.22e-16) (0.108,-2.78e-16) (0.832,-2.22e-16) (-0.514,-1.11e-16) (-0.782,0) (-0.408,-2.22e-16)
(0.823,-2.22e-16) (-0.0452,-1.67e-16) (0.271,0) (-0.726,1.11e-16) (0.998,-8.88e-16) (0.275,4.44e-16)
(-0.605,2.91e-16) (0.258,-6.94e-18) (0.435,-6.94e-17) (0.608,1.39e-17) (-0.563,5.27e-16) (0.0486,7.11e-17)
- См. также
- compute()
compute()
| EigenSolver& Eigen::EigenSolver< _MatrixType >::compute | ( | const EigenBase< InputType > & | matrix, |
| bool |
computeEigenvectors = true | ||
| ) |
Вычисляет собственное разложение заданной матрицы.
- Параметры
-
[вход] matrix Квадратная матрица, для которой необходимо вычислить собственное разложение. [вход] computeEigenvectors Если true, вычисляются и собственные векторы, и собственные значения; если false, вычисляются только собственные значения.
- Возвращает
- Ссылка на
*this
Эта функция вычисляет собственные значения вещественной матрицы matrix. Для их получения можно использовать функцию eigenvalues(). Если computeEigenvectors равно true, то также вычисляются собственные векторы, которые можно получить, вызвав eigenvectors().
Матрица сначала сводится к вещественной форме Шура с помощью класса RealSchur. Затем разложение Шура используется для вычисления собственных значений и собственных векторов.
Стоимость вычисления определяется стоимостью разложения Шура, которая приблизительно равна \( 25n^3 \) (где \( n \) – размер матрицы), если computeEigenvectors равно true, и \( 10n^3 \) если computeEigenvectors равно false.
Этот метод повторно использует выделенную память в объекте EigenSolver.
Пример:
EigenSolver<MatrixXf> es; MatrixXf A = MatrixXf::Random(4,4); es.compute(A, /* computeEigenvectors = */ false); cout << "The eigenvalues of A are: " << es.eigenvalues().transpose() << endl; es.compute(A + MatrixXf::Identity(4,4), false); // 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: (0.755,0.528) (0.755,-0.528) (-0.323,0.0965) (-0.323,-0.0965) The eigenvalues of A+I are: (1.75,0.528) (1.75,-0.528) (0.677,0.0965) (0.677,-0.0965)
eigenvalues()
| inline |
Возвращает собственные значения заданной матрицы.
- Возвращает
- Ссылка на константу, на столбец, содержащий собственные значения.
- Предварительное условие
- Должно быть выполнено либо конструктор EigenSolver(const MatrixType&, bool), либо метод compute(const MatrixType&, bool)
Собственные значения повторяются в соответствии с их алгебраической кратностью, поэтому их количество равно количеству строк в матрице. Собственные значения не отсортированы в определенном порядке.
Пример:
MatrixXd ones = MatrixXd::Ones(3,3); EigenSolver<MatrixXd> es(ones, false); cout << "The eigenvalues of the 3x3 matrix of ones are:" << endl << es.eigenvalues() << endl;
Вывод:
The eigenvalues of the 3x3 matrix of ones are:
(-5.31e-17,0)
(3,0)
(0,0)
eigenvectors()
| EigenSolver< MatrixType >::EigenvectorsType Eigen::EigenSolver< MatrixType >::eigenvectors |
Возвращает собственные векторы заданной матрицы.
- Возвращает
- Матрица, столбцы которой представляют собой (возможно, комплексные) собственные векторы.
- Предварительное условие
- Должен быть вызван либо конструктор EigenSolver(const MatrixType&,bool), либо метод compute(const MatrixType&, bool), и
computeEigenvectorsдолжно быть установлено в значение true (по умолчанию).
Столбец \( k \) возвращаемой матрицы является собственным вектором, соответствующим собственному значению с номером \( k \), как возвращается функцией eigenvalues(). Собственные векторы нормированы и имеют (евклидову) норму, равную единице. Возвращаемая функцией матрица является матрицей \( V \) в разложении по собственным значениям \( A = V D V^{-1} \), если оно существует.
Пример:
MatrixXd ones = MatrixXd::Ones(3,3); EigenSolver<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) (0.408,0) (0.408,0)
- См. также
- eigenvalues(), pseudoEigenvectors()
info()
| inline |
- Возвращает
- NumericalIssue, если входные данные содержат INF или NaN значения или произошел переполнение. В противном случае возвращает Success.
pseudoEigenvalueMatrix()
| MatrixType Eigen::EigenSolver< MatrixType >::pseudoEigenvalueMatrix |
Возвращает блочно-диагональную матрицу в псевдо-разложении по собственным значениям.
- Возвращает
- Блочно-диагональная матрица.
- Предварительное условие
- Должен быть вызван либо конструктор EigenSolver(const MatrixType&,bool), либо метод compute(const MatrixType&, bool).
Матрица \( D \), возвращаемая этой функцией, является вещественной и блочно-диагональной. Блоки на диагонали представляют собой либо блоки 1x1, либо 2x2, вида \( \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \). Эти блоки не упорядочены каким-либо определенным способом. Матрицы \( D \) и \( V \), возвращаемые pseudoEigenvectors(), удовлетворяют \( AV = VD \).
- См. также
- pseudoEigenvectors() для примера, eigenvalues()
pseudoEigenvectors()
| inline |
Возвращает псевдособственные векторы заданной матрицы.
- Возвращает
- Константная ссылка на матрицу, столбцы которой являются псевдособственными векторами.
- Предварительное условие
- Должен быть вызван либо конструктор EigenSolver(const MatrixType&,bool), либо метод compute(const MatrixType&, bool), и
computeEigenvectorsдолжно быть установлено в значение true (по умолчанию).
Вещественная матрица \( V \), возвращаемая этой функцией, и блочно-диагональная матрица \( D \), возвращаемая pseudoEigenvalueMatrix(), удовлетворяют \( AV = VD \).
Пример:
MatrixXd A = MatrixXd::Random(6,6); cout << "Here is a random 6x6 matrix, A:" << endl << A << endl << endl; EigenSolver<MatrixXd> es(A); MatrixXd D = es.pseudoEigenvalueMatrix(); MatrixXd V = es.pseudoEigenvectors(); cout << "The pseudo-eigenvalue matrix D is:" << endl << D << endl; cout << "The pseudo-eigenvector matrix V is:" << endl << V << endl; cout << "Finally, V * D * V^(-1) = " << endl << V * D * V.inverse() << 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 pseudo-eigenvalue matrix D is:
0.049 1.06 0 0 0 0
-1.06 0.049 0 0 0 0
0 0 0.967 0 0 0
0 0 0 0.353 0 0
0 0 0 0 0.618 0.129
0 0 0 0 -0.129 0.618
The pseudo-eigenvector matrix V is:
-0.571 -0.888 -0.066 -1.13 17.2 -3.53
0.263 -0.204 -0.869 0.21 9.73 10.7
-0.827 -0.352 0.209 0.0871 -9.74 -4.17
-1.15 0.0535 -0.0857 -0.971 9.36 -4.52
-0.485 0.258 0.436 0.337 -9.74 -2.21
0.206 0.353 -0.426 -0.00873 -0.944 2.98
Finally, V * D * V^(-1) =
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
- См. также
- pseudoEigenvalueMatrix(), eigenvectors()
The documentation for this class was generated from the following file:
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/classEigen_1_1EigenSolver.html