clojure中的符号矩阵库,需要建议

时间:2012-11-16 21:21:38

标签: clojure computer-algebra-systems

虽然有很多用于线性代数的java库,但Clojure目前还没有一个惯用的计算机代数系统,它包括对符号数学的支持。作为一个开始,我想我可以开始做一些简单的事情了。

作为第一步,我认为正确的数据结构将是一个良好的开端。

第1步:实施持久矩阵

我将使用deftype(或reify),而目前为了便于实施,我将使用散列图进行存储(如果认为更好但是状态权衡,请提出替代方案) 。 (可以想象许多不同的实现,具体取决于您的性能要求,例如使用数组或委托给外部Java库并实现某种瞬态接口。)

我的问题是,我应该考虑实施哪些接口/协议? (一般来说,什么是clojure使用的所有协议/接口的良好列表?)还有关于如何实现这些协议/接口的建议吗?

我要实施的事项清单:

-Assoc'ing对于以不可变的方式修改矩阵的各个部分很有用

- 创建矩阵作为元素的访问者的函数,我想你可以传递一个两元组来返回一个元素,一个值(索引宽度* y + x),hashmap来获取列,行或次要,通过自定义查询hashmap / language。

请注意,我目前的目标是设计良好的抽象,以便灵活选择实施。

5 个答案:

答案 0 :(得分:2)

我或多或少地管理SymPy中的线性代数模块,这是一个主要的Python符号包。我将从传统的计算机代数系统中汲取我的观点。

我们针对三个重要用例有三个单独的实现

  1. 可变矩阵 - 尽管在Python中,SymPy默认是不可变的。我们实际上已经破坏了矩阵的这个规则。矩阵算法是出于性能原因需要切换到可变性的标准示例。
  2. 不可变矩阵 - 但您可以选择切换回来。我们的预期工作流程如下

    1. 构建不可变矩阵
    2. 切换到可变性并执行一些算法
    3. 切换回不变性并将其呈现给用户
  3. 矩阵符号 - 通常您不需要处理矩阵中的显式条目,而是需要处理矩阵的概念。见scicomp.stackexchange post。这是my current work,我发现它非常令人兴奋。

  4. 还有其他分裂,如密集表示与稀疏性。符号线性代数是一个重要的重要领域。我期待看到Clojure社区的集体解决方案。

答案 1 :(得分:1)

虽然它是一个Java库,但我设计了{Cnjure中使用的vectorz

它为高性能矢量和矩阵数学提供了大量数据结构和算法。你可能会发现它很有用。我目前正在Clojure中将它用于计算机图形学和机器学习。

矩阵和向量是可变的,但我发现这是一个必要的恶:使用不可变向量和矩阵对于许多算法而言太慢了。

我有兴趣构建一个惯用的clojure包装器(包括向量和矩阵的不可变版本),如果有足够多的人会发现它有用和/或想要参与其中。

答案 2 :(得分:1)

对于这个帖子的读者来说,Gerry Sussman的 scmutils 系统被移植到Clojure可能会引起人们的兴趣。 这是一个非常先进的CAS,提供自动区分,文字功能等等,与 Maple 的风格非常相似。 它在麻省理工学院用于动力学和微分几何的高级程序,以及相当多的电气工程。它也是Sussman& Wisdom的“续集”(LOL)中用于 SICP SICM (经典力学的结构和解释)的系统。 虽然最初是一个Scheme程序,但这不是直接翻译,而是利用Clojure的最佳功能进行重新编写。它被命名为 sicmutils ,以纪念原版和书籍 这项出色的努力是科林史密斯的工作,您可以在https://github.com/littleredcomputer/sicmutils找到它。

我相信这可以构成一个惊人的Clojure计算机代数系统的基础,与其他任何可用的东西竞争。虽然它是一个非常巨大的野兽,你可以想象,还有大量的东西需要移植,基础知识几乎就在那里,系统会有所区别,并且很好地处理文字和文字功能。这是一项正在进行的工作。该系统还使用Sussman倡导的“通用”方法,从而可以将操作应用于函数,创建一个简单的抽象,简化符号的结束。

这是一个品尝者:

WebView

SicmUtils引入了两个新的矢量类型“向上”和“向下”(称为“结构”),它们的工作方式与您期望的矢量相似,但具有一些特殊的数学(协变,逆变)属性,还有一些编程属性,因为它们是可执行的!

> (def unity (+ (square sin) (square cos)))
> (unity 2.0)  ==>  1.0
> (unity 'x)   ==> 1 ;; yes we can deal with symbols
> (def zero (D unity))  ;; Let's differentiate
> (zero 2.0)   ==> 0

完全支持部分区分

> (def fnvec (up sin cos tan))  => fnvec
> (fnvec 1)   ==> (up 0.8414709848078965 0.5403023058681398 1.5574077246549023)
> ;; differentiated
> ((D fnvec) 1)  ==>  (up 0.5403023058681398 -0.8414709848078965 3.425518820814759) 
> ;; derivative with symbolic argument
> ((D fnvec) 'θ) ==> (up (cos θ) (* -1 (sin θ)) (/ 1 (expt (cos θ) 2)))  

系统还支持TeX输出,多项式因子分解和许多其他好东西。然而,许多可以轻松实施的东西并非完全出于缺乏人力资源。图形输出和“记事本/工作表”界面(使用Clojure的Gorilla)也在进行中。

我希望这已经在某种程度上促使你的胃口足以访问该网站并给它一个旋转。你甚至不需要Clojure,你可以从提供的jar文件中运行它。

======

PS。顺便说一句,要直接回答原始问题,是的, sicmutils 确实支持符号结构:您可以设置矩阵表示,其中条目是公式,例如旋转矩阵,然后评估(乘)它给定的坐标。它以这种方式非常灵活。

答案 3 :(得分:0)

这可能没有回答你的问题,但我在与Incanter合作时发现的一件事是我需要能够使用环绕式访问元素。对于向量来说,有时候能够提供负索引来从末端反向访问元素,或者从一开始就访问元素的超出范围索引。自然地计算偏移会增加开销,但有时候它是你愿意支付的功能

答案 4 :(得分:0)

MPL是一个用便携式R6RS方案编写的简单符号数学库。这是一个short introduction

由于Scheme是一个Lisp,MPL应该非常简单地移植到Clojure。