Существует ли "улучшенный" метод numpy/scipy dot?

Проблема

Я хотел бы вычислить следующее, используя numpy или scipy:

Y = A**T * Q * A

где A - матрица m x n, A**T - транспонирование A и Q - диагональная матрица m x m.

Поскольку Q - диагональная матрица, я сохраняю только ее диагональные элементы в виде вектора.

Способы решения для Y

На данный момент я могу придумать два способа вычисления Y:

  1. Y = np.dot(np.dot(A.T, np.diag(Q)), A) и
  2. 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 вместе с ним?

27
задан Woltan 28 February 2012 в 08:44
поделиться