4

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

我想那里有一些不错的库,但我认为需要一种适当的语言来获得表现力。

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

4

6 回答 6

3

大多数 Mathworks Matlab 都是基于英特尔数学内核库 (MKL) 构建的,它是 (恕我直言) 线性代数计算中无与伦比的冠军。有 java 支持,但需要 500 美元(MKL,不仅仅是 java 支持)...

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

纯 Java 库的性能显然很糟糕,请参见此处...

于 2013-03-14T15:04:32.363 回答
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 库:

Groovy 为 Java 程序员提供了平滑的学习曲线和类似于 Ruby 的灵活语法。在其上编写 DSL 也很容易

虽然 Groovy 的性能对于动态语言来说相当不错,但如果您需要静态编译,您可以使用它。

于 2013-03-14T16:04:13.317 回答
2

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

还有微风,它针对机器学习,但包含相当多的线性代数内容。

于 2013-03-14T15:40:37.257 回答
2

根据您想要从事的工作量以及您已经熟悉的语言, Clojure 世界中的Incanter可能值得一看。现在在 Clojure 中快速发展的还有core.matrix,它旨在将高级通用抽象封装在使用各种方法或包实现的线性代数中。

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

于 2013-03-14T15:45:29.060 回答
2

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

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

我最终选择了 Clojure,原因如下:

  • 函数式编程:Clojure 本质上是一种函数式编程语言,比大多数其他语言更重要(尽管不如 Haskell....)。惰性无限序列、持久数据结构、贯穿始终的不变性等。当您处理大型计算时,这些都是优雅的代码。
  • 元编程:我看到需要为向量/计算表达式进行代码生成。因此,成为 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 的特性决定了它。

于 2013-03-15T09:27:50.580 回答
0

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

于 2013-03-14T16:38:46.070 回答