Мне нужно было вычислить Q ^ N для множества различных значений N (от 1 до 10000), а 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, как указано здесь)?
- Есть ли в numpy функция, которая уже делает это?
Edit:
- Похоже, что для другой матрицы P не обратим. Поэтому я добавляю новый вопрос: как я могу изменить матрицу P, чтобы она стала обратимой, но результирующая матрица не слишком изменена? Я имею в виду, что это нормально, если значения близки к реальному результату, закрываясь, я имею в виду ~ 0,0001.