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