Проблема
Я хотел бы вычислить следующее с помощью numpy или scipy:
Y = A**T * Q * A
где A
- матрица m x n
, A**T
- это транспонирование A
, а Q
- диагональная матрица m x m
.
Так как Q
- диагональная матрица, я сохраняю только ее диагональные элементы в качестве вектора.
Способы решения для Y
В настоящее время я могу представить два способа расчета Y
:
-
Y = np.dot(np.dot(A.T, np.diag(Q)), A)
и -
Y = np.dot(A.T * Q, A)
.
Ясно, что вариант 2 лучше, чем вариант 1, так как никакая реальная матрица не должна создаваться с помощью diag(Q)
(если это то, что действительно делает numpy...)
Тем не менее, оба метода страдают от недостатка необходимости выделять больше памяти, чем это действительно необходимо, поскольку A.T * Q
и np.dot(A.T, np.diag(Q))
необходимо сохранить вместе с A
, чтобы вычислить Y
.
Вопрос
Есть ли метод numpy/scipy, который бы устранил ненужное выделение дополнительной памяти, где вы могли бы пропускать только две матрицы A
и B
(в моем случае B
есть A.T
) и весовой вектор Q
вместе с ним?