Chciałbym efektywnie manipulować macierzami (pełnymi lub rzadkimi) za pomocą biblioteki wektorowej Haskell.unboxing, (rzadkie) macierze i biblioteka wektorów haskell
Oto typu matryca
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
Jak widać, matryca jest wektorem odpakowanych wektorów. Teraz chciałbym zrobić produkt punktowy między wektorem a matrycą. Jest to dość proste dzięki połączeniu sumy, suwaka i mapy.
Ale jeśli to zrobię, ponieważ mapuję przez rzędy macierzy, wynikiem jest wektor pudełkowy, mimo że można go rozpakować.
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)
Jak skutecznie uzyskać rozpakowany wektor?
co jest wadą Field? –