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

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

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

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

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

Заранее спасибо,

Алекс


person Alexander Cska    schedule 05.07.2014    source источник
comment
Разве Intel не предоставляет примеры кода в своей документации? Если вы не можете показать ТАК, что вы сделали, предпочтительно с помощью кода, и быть достаточно конкретным в отношении проблемы программирования, с которой вы застряли, вы вряд ли получите здесь большую помощь. Вы даже можете получить отрицательные голоса, и ваш вопрос может привлечь близкие голоса.   -  person High Performance Mark    schedule 06.07.2014
comment
Эта процедура называется DGEEV (если работает с двойным). Вот примеры: software.intel.com /сайты/продукты/документация/doclib/mkl_sa/   -  person francis    schedule 06.07.2014
comment
Привет, Фрэнсис, спасибо за ваш ответ. Это именно то, что мне нужно, но, как оказалось, мне нужно разреженное хранилище. Матрица у меня слишком большая, чтобы поместиться в память при использовании плотного хранилища.   -  person Alexander Cska    schedule 06.07.2014
comment
Вы можете взглянуть на библиотеку SLEPc grycap.upv.es/slepc , особенно на руководство по их использованию и модуль EPS grycap.upv. es/slepc/documentation/current/docs/manualpages/EPS/ Посмотрите их примеры grycap.upv.es/slepc/documentation/current/src/eps/examples/   -  person francis    schedule 06.07.2014
comment
Привет, я экспериментировал с процедурами собственных значений. К сожалению, кроме MKL, мне не удалось их запустить. Мануалы полная хрень и не очень понятно что надо делать. ARPACK — самый яркий тому пример. Я пробовал кодировать некоторые алгоритмы сам. К сожалению, я не смог получить то, что мне было нужно.   -  person Alexander Cska    schedule 14.08.2014


Ответы (1)


ARPACK, вероятно, правильно использовать. Это старый код на Фортране, и его установка может быть сложной (хотя, возможно, поддерживается 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 наименьших собственных значений.

person Alec Jacobson    schedule 22.02.2017