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

clojure中的符号矩阵库,需要建议,clojure,computer-algebra-systems,Clojure,Computer Algebra Systems,虽然有很多用于线性代数的java库,但Clojure目前还没有一个惯用的计算机代数系统,包括对符号数学的支持。首先,我想我可以开始做一些简单的事情 作为第一步,我认为正确的数据结构将是一个良好的开端 步骤1:实现持久化矩阵 我将使用deftype(或reify),现在,为了便于实现,我将使用hashmap进行存储(如果您认为它更好,请建议另一种方法,但需要进行状态权衡)。(根据您的性能要求,可以想象许多不同的实现,例如使用数组或委托给外部java库,以及实现某种瞬态接口。) 我的问题是,我应该考

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

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

步骤1:实现持久化矩阵

我将使用
deftype
(或
reify
),现在,为了便于实现,我将使用hashmap进行存储(如果您认为它更好,请建议另一种方法,但需要进行状态权衡)。(根据您的性能要求,可以想象许多不同的实现,例如使用数组或委托给外部java库,以及实现某种瞬态接口。)

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

我要实施的事项清单:

-关联将是有用的,以不变的方式修改矩阵的各个部分

-将矩阵视为元素访问器的函数,我认为可以通过自定义查询hashmap/语言传递两个元组以返回单个元素、单个值(按宽度*y+x索引)、hashmap以获取列、行或次元素


注意,我目前的目标是设计良好的抽象,使选择实现时具有灵活性。

虽然它是一个Java库,但我设计用于Clojure

它为高性能向量和矩阵数学提供了许多数据结构和算法。你可能会发现它很有用。我目前在Clojure使用它进行计算机图形学和机器学习

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


如果有足够多的人认为这很有用并且/或者想参与进来,我会对构建一个惯用的clojure包装器(包括向量和矩阵的不可变版本)感兴趣。

我或多或少地在一个主要的Python符号包中管理线性代数模块。我将从传统的计算机代数系统中给出我的观点

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

  • 可变矩阵——尽管在Python中,Symphy在默认情况下是不可变的。我们实际上已经打破了矩阵的这个规则。矩阵算法是一个标准示例,说明出于性能原因,您确实需要切换到可变性
  • 不可变矩阵——但您希望有切换回的选项。我们预期的工作流程如下

  • 建立一个不变的矩阵
  • 切换到可变并执行一些算法
  • 切换回不变性,并将其呈现给用户
  • 矩阵符号——通常不需要处理矩阵中的显式条目,而是处理矩阵的概念。看这个。这是我的梦想,我觉得这是非常令人兴奋的


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

    这可能无法回答您的问题,但我在使用白炽灯时发现,我需要能够使用wraparound访问元素。对于向量也是一样,有时可以提供负索引从末尾反向访问元素,或者提供超出范围的索引从一开始访问元素。自然地,计算偏移量会增加开销,但有时这是您愿意支付的功能。

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


    由于Scheme是一个Lisp,MPL应该可以非常直接地移植到Clojure。

    本线程的读者可能会感兴趣,Gerry Sussman的scmutils系统正在移植到Clojure。 这是一个非常先进的CAS,提供自动微分、文字函数等功能,非常类似于Maple。 它在麻省理工学院用于动力学和微分几何的高级课程,以及相当一部分电子工程的东西。它也是Sussman&Wisdom的《SICP续集》(LOL)中使用的系统,SICM(经典力学的结构和解释)。 虽然最初是一个Scheme程序,但这不是直接翻译,而是利用Clojure的最佳功能进行的彻底重写。它被命名为sicmutils,以纪念原著和这本书 这是科林·史密斯的杰作,你可以在网站上找到

    我相信这可以为Clojure建立一个惊人的计算机代数系统奠定基础,与其他任何可用的系统竞争。尽管它是一个巨大的野兽,正如你所能想象的,还有很多东西需要移植,但基本的东西都在那里,系统将区分开来,并且可以很好地处理文本和文本函数。这是一项正在进行的工作。该系统还使用了Sussman倡导的“通用”方法,通过该方法,可以将操作应用于函数,从而创建了一个伟大的抽象,简化了无终止符号

    这里有一位品酒师:

    > (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
    
    SicmUtils引入了两种新的向量类型“up”和“down”(称为“structures”),它们的工作原理与您所期望的向量差不多,但具有一些特殊的数学(协变、逆变)特性,以及一些编程特性,因为它们是可执行的

    > (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)))  
    
    完全支持部分微分

    > (defn ff [x y] (* (expt x 3)(expt y 5)))
    > ((D ff) 'x 'y) ==> (down (* 3 (expt x 2) (expt y 5)) (* 5 (expt x 3) (expt y 4))) 
    > ;; i.e. vector of results wrt to both variables
    
    该系统还支持TeX输出、多项式分解和许多其他功能。然而,许多可以轻松实现的东西并没有完全实现