У меня есть строка кода, которая включает инверсию матрицы:
X = A @ B @ np.linalg.pinv(S)
A — матрица размера n на n, B — матрица размера n на m, а S — матрица размера m на m. m меньше n, но обычно не на порядок меньше. Обычно m составляет примерно половину n. S — симметричная положительно определенная матрица.
Как мне ускорить выполнение этой строки кода в Python?
я могу сделать
X = np.linalg.solve(S.T, (A@B).T).T
Но мне также интересно, смогу ли я воспользоваться тем фактом, что S симметричен.
@jared, действительно могу, я не знаю об этом методе. Но мне интересно, смогу ли я использовать тот факт, что S симметричен.






Итак, ваша проблема XS = AB = C. Как вы уже сказали, это можно переписать как S'X' = B'A' = C'. C имеет размер m x n, но эту пакетную задачу можно решить с помощью scipy.linalg.solve. В этом случае я рекомендую альтернативу scipy (а не numpy), потому что вы заявили, что S симметричен, поэтому вы можете передать аргумент assume_a = "sym", чтобы scipy выбрал решатель, который использует преимущества матричной структуры.
Итак, ваш код будет выглядеть так:
X = scipy.linalg.solve(S.T, (A@B).T, assume_a = "sym").T
А почему нельзя
X = np.linalg.solve(S.T, (A@B).T).T?