Можем ли мы вычислить только n-е собственное значение и собственный вектор очень большой разреженной матрицы? - PullRequest
4 голосов
/ 25 апреля 2019

У меня очень большая разреженная матрица A = 7Mi-7Mi.Я использую функцию Matlab eigs(A,k), которая может вычислить первые k собственные значения и векторы.Мне нужны все его собственные векторы и значения.Но я не могу хранить все собственные векторы, потому что это требует много памяти.

Есть ли способ (в Matlab или Python), чтобы я мог получить собственные векторы один за другим в цикле for?то есть в ith итерации, я получаю ith собственный вектор и значение.

1 Ответ

1 голос
/ 27 апреля 2019

Если у вас есть надежное предположение о том, насколько велико искомое значение, например lambda_guess, вы можете использовать Power итерацию на

(A - lambda_guess* Id)^-1

Этот подход иногда называютв качестве метода обратного сдвига.Здесь метод будет сходиться к собственному значению, ближайшему к lambda_guess (и чем лучше вы угадываете, тем быстрее сходимость).Обратите внимание, что вы не будете хранить обратное, а только вычисляете решение

x_next_iter = solve(A - lambda_guess*Id, x_iter), возможно, само с помощью итеративного линейного решателя.

Я бы совместил это с методом итерации подпространства сподпространство, по крайней мере, размер два.Таким образом, на первой итерации вы можете найти наименьшее и второе наименьшее собственные значения lambda1, lambda2.

Тогда вы можете попробовать lambdaguess= lambda2+ epsilon, чтобы первый и второй выведенные собственные векторы соответствовали второму и третьему наименьшим собственным значениям соответственно (если первое собственное значение этой итерации не совпадает со значением lambda2 дляВ предыдущей итерации необходимо уменьшить и повторить эпсилон. На практике вы должны проверить, достаточно ли мала их разность, чтобы учесть ошибку округления и тот факт, что итерационные методы никогда не бывают точными).Вы повторяете это, пока не получите номер собственного значения, который вы ищете.Это будет медленно, но вы будете использовать только два собственных вектора в любое время.

ПРИМЕЧАНИЕ: мы предполагаем, что все собственные значения различны, в противном случае эта проблема не будет иметь решение с низким объемом памяти при использовании обычных методов.В общем случае, если максимальная кратность собственного значения равна m, вам потребуется m векторов в памяти для итерации подпространства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...