Эффективная подпрограмма numpy / lapack для произведения обратной и разреженной матрицы?

1

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

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

До сих пор я использую (в numpy)

tmp = B.inv()
return tmp * A

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

Есть ли еще способ ускорить работу?

  • 0
    Это не будет иметь никакого значения для скорости, но почему бы просто не return B.inv() * A ?
  • 0
    как насчет trans(A)*trans(B^-1) = trans(C) ?
Показать ещё 8 комментариев
Теги:
numpy
lapack

1 ответ

3
Лучший ответ

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню