如何使用 Haskell 中的线性库创建矩阵
How to create matrices with the Linear library in Haskell
线性的 documentation 展示了如何使用 V1、V2、V3、V4 函数创建向量和矩阵,以创建维度为 1、2、3、4 的向量。但我想使用具有更多元素的矩阵。
矩阵乘法 example 显示了使用函数 fromList
的示例。
V2 (fromList [(1,2)]) (fromList [(2,3)]) !*! fromList [(1,V3 0 0 1), (2, V3 0 0 5)]
但我似乎无法在 Linear 库中找到该函数。我将如何创建具有任意维度(例如 5x6)的双精度值矩阵?
看看(!*!)
的类型
(!*!) :: (Functor m, Foldable t, Additive t, Additive n, Num a)
=> m (t a) -> t (n a) -> m (n a)
这里重要的约束是Additive
,所以看它的实例
instance Additive []
instance Additive Vector -- ordinary, unsized vectors from the vectors package
instance Additive V0
instance Additive V1
instance Additive V2
instance Additive V3
instance Additive V4 -- Sized vectors from linear up to n = 4
instance Dim n => Additive (V n) -- Vectors of arbitrary dimension where the size is given by a type level number n
-- plus other instances
所以你可以只使用嵌套列表:
m :: [[Int]]
m = [ [ 0,1,2,3,4 ],
[ 1,2,3,4,0 ],
[ 2,3,4,0,1 ],
[ 3,4,0,1,2 ],
[ 4,0,1,2,3 ] ]
msq :: [[Int]]
msq = m !*! m
或嵌套Vectors
import Data.Vector(Vector)
import qualified Data.Vector as V
mv :: Vector (Vector Int)
mv = V.fromList $ V.fromList <$> m
mvsq :: Vector (Vector Int)
mvsq = mv !*! mv
或混搭:
mvl :: Vector [Int]
mvl = V.fromList m
mlv :: [Vector Int]
mlv = V.fromList <$> m
mvlmlv :: Vector (Vector Int)
mvlmlv = mvl !*! mlv
您可以使用 V
来跟踪尺码:
{-# LANGUAGE DataKinds #-}
import Linear.V
mV :: V 5 (V 5 Int) -- GHC.TypeLits.Nat literals
mV = fromJust $ fromVector $ fromJust <$> fromVector <$> mv
mVsq :: V 5 (V 5 Int)
mVsq = mV !*! mV -- does not compile in case of dimension mismatch
线性的 documentation 展示了如何使用 V1、V2、V3、V4 函数创建向量和矩阵,以创建维度为 1、2、3、4 的向量。但我想使用具有更多元素的矩阵。
矩阵乘法 example 显示了使用函数 fromList
的示例。
V2 (fromList [(1,2)]) (fromList [(2,3)]) !*! fromList [(1,V3 0 0 1), (2, V3 0 0 5)]
但我似乎无法在 Linear 库中找到该函数。我将如何创建具有任意维度(例如 5x6)的双精度值矩阵?
看看(!*!)
的类型
(!*!) :: (Functor m, Foldable t, Additive t, Additive n, Num a)
=> m (t a) -> t (n a) -> m (n a)
这里重要的约束是Additive
,所以看它的实例
instance Additive []
instance Additive Vector -- ordinary, unsized vectors from the vectors package
instance Additive V0
instance Additive V1
instance Additive V2
instance Additive V3
instance Additive V4 -- Sized vectors from linear up to n = 4
instance Dim n => Additive (V n) -- Vectors of arbitrary dimension where the size is given by a type level number n
-- plus other instances
所以你可以只使用嵌套列表:
m :: [[Int]]
m = [ [ 0,1,2,3,4 ],
[ 1,2,3,4,0 ],
[ 2,3,4,0,1 ],
[ 3,4,0,1,2 ],
[ 4,0,1,2,3 ] ]
msq :: [[Int]]
msq = m !*! m
或嵌套Vectors
import Data.Vector(Vector)
import qualified Data.Vector as V
mv :: Vector (Vector Int)
mv = V.fromList $ V.fromList <$> m
mvsq :: Vector (Vector Int)
mvsq = mv !*! mv
或混搭:
mvl :: Vector [Int]
mvl = V.fromList m
mlv :: [Vector Int]
mlv = V.fromList <$> m
mvlmlv :: Vector (Vector Int)
mvlmlv = mvl !*! mlv
您可以使用 V
来跟踪尺码:
{-# LANGUAGE DataKinds #-}
import Linear.V
mV :: V 5 (V 5 Int) -- GHC.TypeLits.Nat literals
mV = fromJust $ fromVector $ fromJust <$> fromVector <$> mv
mVsq :: V 5 (V 5 Int)
mVsq = mV !*! mV -- does not compile in case of dimension mismatch