Me gustaría manipular matrices (completas o dispersas) de manera eficiente con la biblioteca de vectores de haskell.unboxing, (dispersas) matrices y biblioteca de vectores haskell
Aquí es un tipo de matriz
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
Como se puede ver, la matriz es un vector de vectores sin embalaje. Ahora, me gustaría hacer un producto de punto entre un vector y una matriz. Es bastante simple de hacer combinando una suma, zip y mapa.
Pero si hago eso, porque estoy mapeando a través de las filas de la matriz, el resultado es un vector en caja, aunque podría estar desagrupado.
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)
¿Cómo puedo obtener un vector sin embalaje como resultado de manera eficiente?
¿Cuál es la definición de campo? –