У меня есть линейная система, в которой все матрицы являются диагональными. У них N
блоки одинаковы по форме.Numpy: эффективная линейная алгебра для блочно-диагональных матриц в сжатом формате
Матрицы хранятся в сжатом виде в виде массивов numpy с формой (N, n, m)
, а форма векторов - (N, m)
.
я в настоящее время реализована матрица-векторное произведение в
import numpy as np
def mvdot(m, v):
return (m * np.expand_dims(v, -2)).sum(-1)
Благодаря правилам вещания, если все блоки матрицы одинаковы я должен хранить его только один раз в массиве с формой (1, n, m)
: продукт с вектором (N, m)
все еще дает правильный вектор (N, n)
.
Мои вопросы:
- как реализовать эффективную матрицу-матричный продукт, который дает матрицу с формой
(N, n, m)
из двух матриц с формами(N, n, p)
и(N, p, m)
? - есть ли способ выполнить эти операции с помощью встроенной (возможно, более быстрой) функции
numpy
? Такие функции, какnp.linalg.inv
, заставляют меня думать, чтоnumpy
был разработан для поддержки этого сжатого формата для блочных диагональных матриц.
Похоже, вы также можете использовать стандартное матричное умножение с разреженным представлением для блок-диагональной системы. – Bort
Что это значит? используя метод 'dot'? – dPol
Да, вместо работы с тензором (N, n, m) в качестве сжатого формата вы можете сохранить их как 2d-матрицы (N * n, N * m) с разреженным представлением и использовать размножение матричной матрицы или умножение матричного вектора. – Bort