#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 наименьших собственных значений.