распаковка, (разреженные) матрицы и библиотека векторов haskell
Я хотел бы эффективно манипулировать матрицами (полными или разреженными) с векторной библиотекой haskell.
Вот тип матрицы
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector as V
data Link a = Full (V.Vector (U.Vector a))
| Sparse (V.Vector (U.Vector (Int,a)))
type Vector a = U.Vector a
Как видите, матрица - это вектор неупакованных векторов. Теперь я хотел бы сделать точечное произведение между вектором и матрицей. Это довольно просто сделать, комбинируя сумму, почтовый индекс и карту.
Но если я сделаю это, поскольку я отображаю строки матрицы, результатом будет вектор в штучной упаковке, даже если он может быть распакован.
propagateS output (Field src) (Full weights) = V.map (sum out) weights
where out = U.map output src
sum s w = U.sum $ zipWithFull (*) w s
propagateS output (Field src) (Sparse weights) = V.map (sum out) weights
where out = U.map output src
sum s w = U.sum $ zipWithSparse (*) w s
zipWithFull = U.zipWith
zipWithSparse f x y = U.map f' x
where f' (i,v) = f v (y U.! i)
Как эффективно получить распакованный вектор в результате?