用于在JVM上进行富有表现力,功能丰富的数值计算的工具

时间:2013-03-14 14:49:02

标签: matlab scala groovy clojure jvm

我正在寻找JVM上的数值计算工具。我的主要要求是表达性/可读性,易用性,评估和数学函数方面的特征。我想我在JVM之后就像Matlab内核(可能包括一些基本库和w / o图形)。我希望能够在正在运行的JVM上“抛出”计算代码,并希望对此代码进行评估。我不想担心类型。任意精度和性能都不是那么重要。

我想有一些不错的图书馆,但我认为需要一个合适的语言才能获得表现力。

你们建议使用哪种工具来解决JVM上富有表现力,功能丰富的数值计算问题?

6 个答案:

答案 0 :(得分:3)

大多数Mathworks Matlab都是基于英特尔数学核心库(MKL)构建的,它是(IMHO)线性代数计算中无与伦比的冠军。有java支持,但它花费500美元(MKL,而不仅仅是java支持)......

如果你想使用java,最好的第二个选项是jblas,它使用线性代数的行业标准BLAS和LAPACK。

纯Java库的表现显然很糟糕,请参阅here ...

答案 1 :(得分:3)

来自jGroovyLab页面:

  

GroovyLab环境旨在提供一个类似Matlab / Scilab的科学计算平台,该平台由以Groovy语言实现的脚本引擎支持。 GroovyLab用户既可以使用Matlab-lke命令控制台,也可以使用基于jsyntaxpane(http://code.google.com/p/jsyntaxpane/)组件的灵活编辑器,它可以提供更方便的代码开发。此外,GroovyLab支持基于symja(http://code.google.com/p/symja/)项目的计算机代数。

还有GroovyLab

  

GroovyLab是Groovy类的集合,用于提供类似matlab的语法和基本功能(线性代数,2D / 3D图)。它基于jmathplot和jmatharray libs:

Groovy为Java程序员提供了流畅的学习曲线,并且具有类似于Ruby的灵活语法。 It is also pretty easy to write a DSL on it

虽然Groovy是performance is pretty good for a dynamic language,但如果您需要,可以使用static compilation

答案 2 :(得分:2)

Spire听起来像瞄准你正在看的区域。它利用了许多最近的scala功能(如宏)来获得不错的性能,而不必牺牲高级语言的表现力。

还有breeze,它针对的是机器学习,但包括相当数量的线性代数。

答案 3 :(得分:2)

根据您想要进入的工作量以及您已熟悉的语言,Clojure世界中的Incanter可能值得一看。现在在Clojure中快速发展的是core.matrix,其目的是将高级公共抽象封装在用各种方法或包实现的线性代数中。

你在帖子中强调了表现力,而关于Clojure的好处在于,作为一个Lisp,可以制作或扩展DSL以紧密匹配问题域。这是该语言(以及Lisps)的一大特色。

答案 4 :(得分:2)

我是Clojure core.matrix的原创作者。所以我在这个特定的领域有一个明确的认识和更多的知识。话虽如此,我仍然会尝试给你一个诚实的答案: - )

我和你一年左右的职位相同,正在寻找一种可扩展,灵活且适合作为集群云服务部署的数值计算解决方案。

由于以下原因,我最终选择了Clojure:

  • 功能编程:Clojure是一种功能性编程语言,比大多数其他语言更为重要(尽管没有Haskell那么多......)。懒惰的无限序列,持久的数据结构,不变的等等。当您处理大型计算时,可以使用elegany代码。
  • 元编程:我看到需要为矢量/计算扩展进行代码生成。因此,作为一个Lisp是一个很大的优点:一旦你用一个“全语言”宏系统的同音语言完成代码生成,那么很难找到其他任何接近的东西。
  • 并发 - Clojure对多代码并发性有着令人印象深刻的方法。如果您还没有看到它,请观看:http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • 互动式REPL :我一直觉得对数据工作非常重要。您希望能够“实时”使用您的代码/数据,以真正感受其属性。使用带有交互式REPL的动态类型语言可以在这里创造奇迹。
  • 基于JVM :出于语用目的的巨大优势,因为庞大的库/工具生态系统以及JVM作为运行时平台的出色工程。
  • 社区:我看到Clojure正在进行大量创新,特别是在数据和分析的一般领域。

当时Clojure 缺少的主要内容是用于矩阵操作的良好库/ API。 Incanter中有一些不错的工具,但它们不是非常通用或高效。因此,我开始开发core.matrix,它正在形成一个惯用的Clojure风格的NumPY / SciPY。现在它仍然在进行中,但如果你小心的话,它还可以用于生产。

就低级矩阵支持而言,我还维护vectorz-clj,这是我尝试提供core.mattrix实现,提供高性能向量/矩阵操作,同时保留纯Java(即没有本机依赖) 。如果您对此表现感兴趣,您可能希望看到:

我在Clojure之后的第二选择是Scala。我喜欢Scala稍微更成熟和体面的静态类型系统。这两种语言都是基于JVM的,因此库/工具方面是一个平局。这可能是Lisp的特色所致。

答案 5 :(得分:0)

如果您碰巧可以访问Mathematica,那么通过J / Link可以很容易地使用JVM。对于Clojure来说,Clojuratica是一个很好的库,可以让它尽可能无缝,尽管它已经维持了一段时间,并且可能需要一些努力才能让它再次在现代环境中工作。