Эффективная подпрограмма numpy / lapack для произведения обратной и разреженной матрицы? - PullRequest
1 голос
/ 20 июля 2011

У меня есть матрица B , которая является квадратной и плотной, и матрица A , которая является прямоугольной и разреженной.

Есть ли способ эффективно вычислить произведение B^-1 * A?

Пока что пользуюсь (в numpy)

tmp = B.inv()
return tmp * A

что, я полагаю, делает нас из редкости А. Я думал об использовании разреженного метода numpy.sparse.linalg.spsolve, но для этого требуется B, а не A, чтобы быть разреженным.

Есть ли другой способ ускорить процесс?

1 Ответ

3 голосов
/ 21 июля 2011

Поскольку матрица, которую нужно инвертировать, плотная, spsolve - не тот инструмент, который вам нужен. Кроме того, это плохая численная практика - вычислять обратную матрицу и умножать ее на другую - вам намного лучше использовать LU-разложение , которое поддерживается scipy.

Другой момент заключается в том, что если вы не используете матричный класс (я думаю, что класс ndarray лучше, это вопрос вкуса), вы должны использовать dot вместо оператора умножения. И если вы хотите эффективно умножить разреженную матрицу на плотную матрицу, вам нужно использовать метод dot разреженной матрицы. К сожалению, это работает только в том случае, если первая матрица разрежена, поэтому вам нужно использовать прием, предложенный Anycorn для транспонирования, чтобы поменять порядок операций.

Вот ленивая реализация, которая не использует декомпозицию LU, но которая в противном случае должна быть эффективной:

B_inv = scipy.linalg.inv(B)
C = (A.transpose().dot(B_inv.transpose())).transpose()

Правильное выполнение с разложением LU включает в себя поиск способа эффективного умножения треугольной матрицы на разреженную матрицу, которая в настоящее время ускользает от меня.

...