Наибольшие собственные значения (и соответствующие собственные векторы) в переполнении стека

Какой самый простой и быстрый способ (конечно, с некоторой библиотекой) вычислить k наибольших собственных значений и собственных векторов для большой плотной матрицы в C ++? Я ищу эквивалент MATLAB eigs функция; Я просмотрел Armadillo и Eigen, но не смог найти их, и вычисление всех собственных значений занимает в моем случае вечность (мне нужны топ-10 собственных векторов для плотной несимметричной реальной матрицы размером примерно 30000×30000).

В отчаянии, я даже пытался реализовать итерацию мощности самостоятельно с помощью QR-разложения Армадилло, но столкнулся со сложными парами собственных значений и сдался. 🙂

3

Решение

AFAIK проблема поиска первого k Собственные значения общий Матрица не имеет простого решения. Функция Matlab eigs Вы упомянули, что должен работать с разреженными матрицами.

Matlab, вероятно, использует Arnoldi / Lanczos, вы можете попробовать, если он работает прилично в вашем случае, даже если ваша матрица не разрежена. Справочный пакет для Arnlodi ARPACK который имеет интерфейс C ++.

1

Другие решения

Ты пробовал https://github.com/yixuan/spectra ?
Он похож на ARPACK, но с приятным Eigen-подобным интерфейсом (он совместим с Eigen!)

Я использовал его для матриц 30kx30k (PCA), и это было вполне нормально

1

Эйген имеет собственные значения модуль, который работает довольно хорошо .. Но я никогда не использовал его на чем-то настолько большом.

0
По вопросам рекламы [email protected]