gpt4 book ai didi

haskell - 在 Haskell 上编程矩阵的语言方式是什么?

转载 作者:行者123 更新时间:2023-12-01 12:35:56 25 4
gpt4 key购买 nike

虽然这应该很简单,但每当我需要在 Haskell 上使用矩阵时,我都会遇到困难。我的策略是选择一个具体类型(REPA、Vector、List、IntMap 等)并为其编程。比如我用REPA来求解欧拉的problem 11 ,我经常在马拉松比赛中使用它。不幸的是,REPA 不是一个特别友好的 API——它需要复杂的类型注释,考虑表示并跟踪它,转换它……而且,索引是颠倒的。所有这一切意味着我要花大量时间查看文档并尝试正确对齐类型,这在马拉松比赛中是致命的。

我可以只使用向量/列表,但这也很尴尬,从那时起我需要使用 toIndex::[Int] → Int; fromIndex Int → [Int] 每次我索引向量时都会起作用。

我还尝试为 Data.Vector 创建一个包装器,例如 data Matrix a = Matrix { shape::[a], buffer::Vector a },但很快我发现我还必须为每个向量函数创建一个包装器,以及与可变向量匹配的不同类型等等,这是一团糟。

最后,我所需要的只是一种处理矩阵的简单方法——类似于:

matrix = Matrix.fromList [3,3] [1,2,3,4,5,6,7,8,9]
main = do
matrix' <- set matrix [1,1] 0
print $ get matrix [1,1]
print $ sum matrix

或其他任何让我将矩阵视为数学对象而不是具体实现的东西,但我未能找到一种简单的语言方式。你会怎么做?我想知道 Lens 是否能以某种方式提供帮助?

最佳答案

  • 你的意思是,真的只是矩阵(即具有两个索引维度的数组)?那么hmatrix可能是最适合你的。它的矩阵类型与您的 Vector 包装器略有不同,而且它的界面真的很像“纯函数式 Matlab”(我个人无法遵守的哲学,但是哦,好吧......)率,您可以通过底层 GSL 例程获得高效的线性代数运算、切片等。请注意,这个库并没有真正做有状态的事情,它保留了一个纯函数接口(interface)并依赖于内置例程的优化。

  • 你的意思是,一般的多维数组/张量对逐元素运算比线性代数更感兴趣,并且需要状态更新?然后好老array图书馆可能恰到好处。它似乎在过去几年被 vectorrepa 黯然失色,但 IMO,Data.Ix 索引范式实际上相当不错. repa 的不太成熟但也不太“过度设计”的版本。

  • 如果您实际上主要对线性代数感兴趣,那么您至少应该检查一些更抽象的库。我真的很喜欢 vector-space接口(interface),非常通用和数学,它完全避免了在特定基础上的写入操作,这对捕获“数学错误”有很大帮助。

  • 当你提到 lenses 时,还有 linear - 以不同的方式优雅和抽象。在我看来,它有点(数学上)忽略了线性点,但它仍然很酷,而且肯定比 vector-space 提供更多的操作。

  • 哦,最后,还有 matrix .它与 hmatrix 非常相似,但在原生 Haskell 而不是 GSL 绑定(bind)中实现,这意味着它在高度优化的 LA 算法中不那么丰富,但也没有那么严重的依赖性。除此之外,它看起来稍微优雅一些​​。

关于haskell - 在 Haskell 上编程矩阵的语言方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29805771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com