【问题标题】:How to create matrices with the Linear library in Haskell如何使用 Haskell 中的线性库创建矩阵
【发布时间】:2017-12-23 13:48:27
【问题描述】:

Linear 的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)]

但我似乎无法在线性库中找到该函数。我将如何创建具有任意维度(例如 5x6)的双精度值矩阵?

【问题讨论】:

    标签: haskell linear-algebra


    【解决方案1】:

    (!*!)的类型

    (!*!) :: (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
    

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 1970-01-01
      • 2018-01-11
      • 2015-11-22
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多