Я новичок в библиотеке Eigen и пытаюсь решить обобщенную проблему собственных значений. Согласно документации шаблонного класса GeneralizedEigenSolver в библиотеке Eigen Вот Я могу получить собственные значения, но не собственные векторы. Похоже, функция-член eigenvectors () не реализована. Есть ли какой-либо другой способ, которым я могу генерировать собственные векторы, как только я знаю собственные значения. Я использую Eigen 3.2.4.
Странно, что это не реализовано, документы предполагают, что это так. Это определенно стоит спросить в списке рассылки Eigen или зарегистрировать тикет, возможно, кто-то работает над этим, и это в последнем репозитории.
Я в прошлом использовал GeneralizedSelfAdjointEigenSolver
и это определенно производит собственные векторы. Так что, если вы знаете, что обе ваши матрицы симметричны, вы можете использовать это.
Если ваши матрицы очень маленькие, в качестве быстрого решения вы можете применить стандарт EigenSolver
в M^{-1} A
поскольку
A x = lambda * M x <==> M^{-1} A x = lambda * x,
но очевидно, что для этого требуется вычислить обратную матрицу справа, что очень дорого, так что это действительно последнее средство.
Если ничего не помогает, вы можете использовать специальную библиотеку eigensolver, скажем, ПРАЗДНИК, или используйте подпрограммы LAPACK.
Кажется, он еще не реализован. В конце compute
функция есть:
m_eigenvectorsOk = false;//computeEigenvectors;
показывая, что они на самом деле не рассчитаны. Кроме того, eigenvectors()
Функция закомментирована и выглядит следующим образом (обратите внимание на TODO):
//template<typename MatrixType>
//typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType GeneralizedEigenSolver<MatrixType>::eigenvectors() const
//{
// eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
// eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
// Index n = m_eivec.cols();
// EigenvectorsType matV(n,n);
// // TODO
// return matV;
//}
Если вам нужны собственные значения из одной матрицы, вы можете использовать EigenSolver
как это:
int main(int argc, char *argv[]) {
Eigen::EigenSolver<Eigen::MatrixXf> es;
Eigen::MatrixXf A = Eigen::MatrixXf::Random(4,4);
es.compute(A);
std::cout << es.eigenvectors() << std::endl;
return 0;
}