Spec-Zone.ru › Eigen3

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

template<typename _MatrixType >
typedef std::complex<RealScalar> Eigen::EigenSolver< _MatrixType >::ComplexScalar

Тип комплексного скаляра для MatrixType.

Это std::complex<Scalar> если Scalar вещественный (например, float или double) и просто Scalar если Scalar комплексный.

EigenvalueType

template<typename _MatrixType >
typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> Eigen::EigenSolver< _MatrixType >::EigenvalueType

Тип для вектора собственных значений, возвращаемого методом eigenvalues().

Это столбец с элементами типа ComplexScalar. Длина вектора равна размеру MatrixType.

EigenvectorsType

template<typename _MatrixType >
typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> Eigen::EigenSolver< _MatrixType >::EigenvectorsType

Тип для матрицы собственных векторов, возвращаемой методом eigenvectors().

Это квадратная матрица с элементами типа ComplexScalar. Размер совпадает с размером MatrixType.

Index

template<typename _MatrixType >
typedef Eigen::Index Eigen::EigenSolver< _MatrixType >::Index
Устаревшее:
с Eigen 3.3

EigenSolver() [1/3]

template<typename _MatrixType >
Eigen::EigenSolver< _MatrixType >::EigenSolver ( )
inline

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

Конструктор по умолчанию полезен в тех случаях, когда пользователь намерен выполнять разложения с помощью EigenSolver::compute(const MatrixType&, bool).

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

EigenSolver() [2/3]

template<typename _MatrixType >
Eigen::EigenSolver< _MatrixType >::EigenSolver ( Index size )
inlineexplicit

Конструктор по умолчанию с предварительной выделением памяти.

Аналогично конструктору по умолчанию, но с предварительным выделением внутренней памяти в соответствии с указанным size проблемы.

См. также
EigenSolver()

EigenSolver() [3/3]

template<typename _MatrixType >
template<typename InputType >
Eigen::EigenSolver< _MatrixType >::EigenSolver ( const EigenBase< InputType > & matrix,
bool computeEigenvectors = true
)
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()

template<typename _MatrixType >
template<typename InputType >
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()

template<typename _MatrixType >
const EigenvalueType& Eigen::EigenSolver< _MatrixType >::eigenvalues ( ) const
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(), pseudoEigenvalueMatrix(), MatrixBase::eigenvalues()

eigenvectors()

template<typename MatrixType >
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()

template<typename _MatrixType >
ComputationInfo Eigen::EigenSolver< _MatrixType >::info ( ) const
inline
Возвращает
NumericalIssue, если входные данные содержат INF или NaN значения или произошел переполнение. В противном случае возвращает Success.

pseudoEigenvalueMatrix()

template<typename MatrixType >
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()

template<typename _MatrixType >
const MatrixType& Eigen::EigenSolver< _MatrixType >::pseudoEigenvectors ( ) const
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:
  • EigenSolver.h

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

Spec-Zone.ru

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