У меня есть k*n
матрица X, и k*k
матрицы A. Для каждого столбца X
, я хотел бы, чтобы вычислить скалярноеВычислить «v^TA v» для матрицы векторов v
X[:, i].T.dot(A).dot(X[:, i])
(или, математически, Xi' * A * Xi
).
В настоящее время у меня есть for
цикла:
out = np.empty((n,))
for i in xrange(n):
out[i] = X[:, i].T.dot(A).dot(X[:, i])
но так n
велик, я хотел бы сделать это быстрее, если это возможно (то есть, используя некоторые функции Numpy вместо цикла).
Появляется на * handily * beat мой исходный код: для 'n = 10000, k = 10', мой код - 76,2мс, новый код - 1.64ms *. Ницца! – nneonneo
Это намного быстрее, чем 'np.einsum' для высоких' n', когда ATLAS масштабируется до более 1 ядра ... Я добавил некоторые тайминги к ответу ниже ... –