如何用Linear.V写静态类型校验矩阵运算(Haskell)?
How to use Linear.V to write static type checked matrix operations (Haskell)?
我有兴趣使用 Linear
library 中的 Linear.V
来编写编译时已知大小的矩阵运算。但是,我不确定如何使用这个库。我在哪里可以找到更多关于如何使用它的参考资料?
在不了解你到底想做什么的情况下问这个问题有点棘手,但我会试一试。 Linear.V
为任何 n 提供 n 维向量。在 linear
中,矩阵被定义为向量的向量 - Linear.Matrix
定义了对这些值的操作。 Linear.Matrix
通过在两个函子上进行参数化来处理各种大小的矩阵,并且 Linear.V
确实是一个 Functor
所以我们可以很好地使用这些操作。
下面无聊的例子展示了如何使用 Linear.V
:
{-# LANGUAGE DataKinds #-}
import Linear
import Linear.V
import Data.Vector
identity :: V 2 (V 2 Float)
identity = V (fromList [ V (fromList [1, 0]), V (fromList [0, 1]) ])
calculation :: V 2 (V 2 Float)
calculation = identity !*! identity
这很无聊,因为它只是计算两个单位矩阵的乘积,但它应该让您了解如何将这些部分放在一起。我正在使用 GHC 7.6+ 类型文字来指定 identity
是一个 2x2 矩阵。
请注意,使用 V
构造函数有些危险 - 它允许您 "lie" 关于向量的大小。例如,如果您执行以下操作:
identity :: V 2 (V 2 Float)
identity = V (fromList [ V (fromList [1, 0]) ])
事情可能会变得非常错误。使用 fromVector
或 tabulate
更安全(tabulate
使用 V
的表示 - 这基本上是从元素索引到其值的函数)。
我有兴趣使用 Linear
library 中的 Linear.V
来编写编译时已知大小的矩阵运算。但是,我不确定如何使用这个库。我在哪里可以找到更多关于如何使用它的参考资料?
在不了解你到底想做什么的情况下问这个问题有点棘手,但我会试一试。 Linear.V
为任何 n 提供 n 维向量。在 linear
中,矩阵被定义为向量的向量 - Linear.Matrix
定义了对这些值的操作。 Linear.Matrix
通过在两个函子上进行参数化来处理各种大小的矩阵,并且 Linear.V
确实是一个 Functor
所以我们可以很好地使用这些操作。
下面无聊的例子展示了如何使用 Linear.V
:
{-# LANGUAGE DataKinds #-}
import Linear
import Linear.V
import Data.Vector
identity :: V 2 (V 2 Float)
identity = V (fromList [ V (fromList [1, 0]), V (fromList [0, 1]) ])
calculation :: V 2 (V 2 Float)
calculation = identity !*! identity
这很无聊,因为它只是计算两个单位矩阵的乘积,但它应该让您了解如何将这些部分放在一起。我正在使用 GHC 7.6+ 类型文字来指定 identity
是一个 2x2 矩阵。
请注意,使用 V
构造函数有些危险 - 它允许您 "lie" 关于向量的大小。例如,如果您执行以下操作:
identity :: V 2 (V 2 Float)
identity = V (fromList [ V (fromList [1, 0]) ])
事情可能会变得非常错误。使用 fromVector
或 tabulate
更安全(tabulate
使用 V
的表示 - 这基本上是从元素索引到其值的函数)。