Проблема
Я хотел бы вычислить следующее с помощью 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 вместе с ним?