Spec-Zone.ru › Eigen3

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
Inheritance graph
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

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

RealScalar

template<typename _MatrixType >
typedef NumTraits<Scalar>::Real Eigen::SelfAdjointEigenSolver< _MatrixType >::RealScalar

Тип вещественного скаляра для _MatrixType.

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

RealVectorType

template<typename _MatrixType >
typedef internal::plain_col_type<MatrixType, RealScalar>::type Eigen::SelfAdjointEigenSolver< _MatrixType >::RealVectorType

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

Это столбец со значениями типа RealScalar. Длина вектора равна размеру _MatrixType.

SelfAdjointEigenSolver() [1/3]

template<typename _MatrixType >
Eigen::SelfAdjointEigenSolver< _MatrixType >::SelfAdjointEigenSolver ( )
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]

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

Конструктор, предварительно выделяет память для матриц динамического размера.

Параметры
[in] size Положительное целое число, размер матрицы, собственные значения и собственные векторы которой будут вычислены.

Этот конструктор полезен для матриц динамического размера, когда пользователь намерен выполнять разложения с помощью compute(). Параметр size используется только как подсказка. Неправильный size не является ошибкой, но может ухудшить производительность.

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

SelfAdjointEigenSolver() [3/3]

template<typename _MatrixType >
template<typename InputType >
Eigen::SelfAdjointEigenSolver< _MatrixType >::SelfAdjointEigenSolver ( const EigenBase< InputType > & matrix,
int options = ComputeEigenvectors
)
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()

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

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

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

template<typename _MatrixType >
const RealVectorType& Eigen::SelfAdjointEigenSolver< _MatrixType >::eigenvalues ( ) const
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()

template<typename _MatrixType >
const EigenvectorsType& Eigen::SelfAdjointEigenSolver< _MatrixType >::eigenvectors ( ) const
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()

template<typename _MatrixType >
ComputationInfo Eigen::SelfAdjointEigenSolver< _MatrixType >::info ( ) const
inline

Сообщает, была ли предыдущая вычисление успешной.

Возвращает
Success если вычисление прошло успешно, NoConvergence в противном случае.

operatorInverseSqrt()

template<typename _MatrixType >
MatrixType Eigen::SelfAdjointEigenSolver< _MatrixType >::operatorInverseSqrt ( ) const
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(), MatrixBase::inverse(), Модуль матричных функций

operatorSqrt()

template<typename _MatrixType >
MatrixType Eigen::SelfAdjointEigenSolver< _MatrixType >::operatorSqrt ( ) const
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

template<typename _MatrixType >
const int Eigen::SelfAdjointEigenSolver< _MatrixType >::m_maxIterations
static

Максимальное количество итераций.

Алгоритм завершается, если он не сходится в течение m_maxIterations * n итераций, где n обозначает размер матрицы. В настоящее время это значение установлено в 30 (скопировано из LAPACK).


The documentation for this class was generated from the following file:
  • SelfAdjointEigenSolver.h

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

Spec-Zone.ru

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