Предположим, у меня есть действительно большая (симметричная) матрица M размера N на N, и я просто хочу извлечь один собственный вектор, соответствующий одному собственному значению. Есть ли способ сделать это, не находя все собственные векторы. Я придумал один из способов сделать это: сначала найти собственные значения (что быстро), а затем решить для одного собственного вектора.
E = np.linalg.eigvalsh(M)
e = E[N/2]
v = np.linalg.solve(E-np.diag([e]*N), 0)
Но, конечно, вы можете догадаться, что решение этого просто v = 0. Я мог бы выполнить SVD-разложение M-eI, но мне кажется, что это медленнее, чем просто вычисление всех собственных векторов M.
shift-qr
- это алгоритм, который может это сделать. docs.scipy.org/ doc/scipy-0.15.1/reference/generated/. Аргументsigma
может представлять особый интерес. Обратите внимание, что это разреженная версия linalg. Я не уверен, реализован ли алгоритмshift-qr
в обычном модуле linalg. - person cel   schedule 26.06.2015