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
ご覧のとおり、行列はボックス化されていないベクトルのベクトルです。今、ベクトルと行列の間で内積をしたいと思います。sum、zip、および map を組み合わせることで、かなり簡単に実行できます。
しかし、これを行うと、行列の行を介してマッピングしているため、ボックス化されていない場合でも、結果はボックス化されたベクトルになります。
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)
ボックス化されていないベクトルを結果として効率的に取得するにはどうすればよいですか?