Нахождение собственных значений и собственных векторов большой (разреженной) матрицы

#matrix #lapack #eigenvector #eigenvalue #intel-mkl

#матрица #lapack #собственный вектор #собственное значение #intel-mkl

Вопрос:

Я пытаюсь вычислить собственные векторы (скажем, первые 10 из них) большой матрицы. Мои первоначальные проблемы были вызваны неправильным пониманием библиотеки Intel MKL. Чтобы сделать мой вопрос ясным и легким для понимания, я решил обобщить его и убрать некоторые ненужные детали.

Основной вопрос таков: какой компьютерный код следует использовать для нахождения собственных значений большой разреженной матрицы?

Имеющуюся у меня матрицу можно считать разреженной при определенных приближениях. А именно, значения становятся очень маленькими при удалении от диагонали. Некоторые из них даже нефизичны, вызваны эффектами статистики (матрица генерируется кодом MC). Вот почему термин «разреженный» заключен в квадратные скобки.

Я буду признателен, если кто-нибудь сможет предоставить пример кода.

Заранее благодарю,

Алекс

Комментарии:

1. Разве Intel не предоставляет примеры кода в своей документации? Если вы не можете показать SO, что вы сделали, предпочтительно с помощью кода, и быть достаточно конкретным в отношении проблемы программирования , на которой вы застряли, вы вряд ли получите здесь большую помощь. Вы даже можете получить голоса с понижением, и ваш вопрос может привлечь много голосов.

2. Эта процедура вызывается DGEEV (при работе с double). Вот примеры: software.intel.com/sites/products/documentation/doclib/mkl_sa /…

3. Привет, Фрэнсис, спасибо за твой ответ. Это именно то, что мне было нужно, но, как оказалось, мне нужно разреженное хранилище. Имеющаяся у меня матрица слишком велика, чтобы поместиться в память при использовании плотного хранилища.

4. Вы можете взглянуть на библиотеку SLEPc grycap.upv.es/slepc , особенно в руководстве по их использованию и модуле EPS grycap.upv.es/slepc/documentation/current/docs/manualpages/EPS/… Посмотрите на их примеры grycap.upv.es/slepc/documentation/current/src/eps/examples /…

5. Привет, я экспериментировал с подпрограммами на собственные значения. К сожалению, кроме MKL, я действительно не смог запустить их. Руководства — настоящее дерьмо, и не очень понятно, что следует делать. ARPACK является наиболее ярким примером этого. Я попытался сам закодировать некоторые алгоритмы. К сожалению, я не смог получить то, что мне было нужно.

Ответ №1:

ARPACK, вероятно, правильная вещь для использования. Это старый код fortran, и его установка может быть затруднительной (хотя, возможно, поддерживаемый arpack-ng лучше).

В качестве альтернативы, в libigl есть грубая реализация итераций мощности, построенных поверх собственного значения. Вы можете использовать версию libigl точно так же, как MATLAB eigs :

 Eigen::SparseMatrix<double> A;
Eigen::SparseMatrix<double> B;
...
Eigen::MatrixXd V;
Eigen::VectorXd D;
igl::eigs(A,B,3,igl::EIGS_TYPE_SM,V,D);
  

Это позволит вычислить собственные векторы в столбцах V и собственные значения в D для 3 наименьших собственных значений.