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