Поскольку матрица, которую нужно инвертировать, плотная, spsolve
- не тот инструмент, который вам нужен. Кроме того, это плохая численная практика - вычислять обратную матрицу и умножать ее на другую - вам намного лучше использовать LU-разложение , которое поддерживается scipy.
Другой момент заключается в том, что если вы не используете матричный класс (я думаю, что класс ndarray лучше, это вопрос вкуса), вы должны использовать dot
вместо оператора умножения. И если вы хотите эффективно умножить разреженную матрицу на плотную матрицу, вам нужно использовать метод dot
разреженной матрицы. К сожалению, это работает только в том случае, если первая матрица разрежена, поэтому вам нужно использовать прием, предложенный Anycorn для транспонирования, чтобы поменять порядок операций.
Вот ленивая реализация, которая не использует декомпозицию LU, но которая в противном случае должна быть эффективной:
B_inv = scipy.linalg.inv(B)
C = (A.transpose().dot(B_inv.transpose())).transpose()
Правильное выполнение с разложением LU включает в себя поиск способа эффективного умножения треугольной матрицы на разреженную матрицу, которая в настоящее время ускользает от меня.