Мне нужно было вычислить Q^N для множества различных значений N (от 1 до 10000) и Numpy было слишком медленным.Быстрее мощность матрицы, чем numpy?
Я спросил у math.stackexchange.com, если бы я мог избежать вычисления Q^N для моей конкретной потребности, и кто-то ответил мне, что вычисление Q^N должно быть довольно быстрым, используя метод P D^N P^-1
.
Так в основном, вместо того, чтобы делать:
import numpy as np
from numpy import linalg as LA
...
LA.matrix_power(m, N)
Я пробовал:
diag, P = LA.eig(m)
DN = np.diag(diag**N)
P1 = LA.inv(P)
P*DN*P1
И я получаю ту же матрицу, как результат (пытался на одном примере)
О более сложной матрице, Q:
% timeit.Timer('Q**10000', setup=setup).repeat(2, 100)
[5.87254786491394, 5.863131046295166]
% timeit.Timer('diag, P = linalg.eig(Q); DN=np.diag(diag**10000);P1=linalg.inv(P); P*DN*P1', setup=setup).repeat(2, 100)
[2.0032401084899902, 2.018735885620117]
И что касается моей первоначальной проблемы, второй метод позволяет мне вычислить P, diag and P1
только один раз и использовать его тысячи раз. Этот метод используется в 8 раз быстрее.
Мои вопросы:
- В этом случае не представляется возможным использовать этот последний метод для вычисления Q^N?
- Можно ли использовать его в моем случае (матрица Q, как указано here)?
- Есть ли в numpy функция, которая уже делает это?
Edit:
- Оказывается, что для другой матрицы P не является обратимым. Поэтому я добавляю новый вопрос: как я могу изменить матрицу P, чтобы она стала обратимой, но результирующая матрица не слишком изменена? Я имею в виду, что это нормально, если значения близки к реальному результату, закрываясь, я имею в виду ~ 0,0001.
Спасибо за интересный вопрос (+1) – NPE
Что касается моих 2 первых вопросов, я думаю, что Q не должно быть дефектным. Но я не знаю, являются ли мои матрицы дефектными или нет (из-за моего математического фона слишком далеко). –
Вы можете ускорить это, выполнив 'diag ** 10000', используя метод возведения в степень методом квадратизации. См. [Мой ответ на другой вопрос] (http://stackoverflow.com/a/18453999/15055), где я реализую его в numpy. – Claudiu