【问题标题】:matlab matrix functions in javajava中的matlab矩阵函数
【发布时间】:2025-12-02 17:40:01
【问题描述】:

我注意到 matlab 执行一些矩阵函数的速度非常快,例如,即使矩阵很大,向 n*n 数组的所有元素添加 5 也几乎立即发生,因为您不必遍历每个元素,执行在java中,如果矩阵很大,for循环需要永远。

我有两个问题,java 中是否有高效的内置类来进行矩阵运算,第二,我如何编写代码来更有效地更新 java 中大矩阵的所有元素。

【问题讨论】:

  • 你不能真正比较matlab循环和java循环,java要快得多。毫无疑问,java 循环仍然比用 C 编写的特殊数学库慢。但是你确定你最大的低效率是在矩阵运算中吗?根据我对从 matlab 移植到 java 的相同应用程序的经验,具有中等大小的矩阵且没有矩阵求逆,累积性能是相似的。当然,我们在矩阵乘法/加法上失去了性能,但我们在其他所有方面都获得了性能,比如方法调度和 gui。
  • 这里是 Matlab 函数列表及其在 EJML code.google.com/p/efficient-java-matrix-library/wiki/… 中的等效函数。大多数都是非常直接的转化。

标签: java matlab


【解决方案1】:

刚刚偶然发现这篇文章,并认为我会投入两分钱。我是 EJML 的作者,我也在为 java 库制定性能和稳定性基准。虽然确定算法的速度有几个问题,但 Mikhail 是正确的,缓存在大型矩阵的性能中是一个非常重要的问题。对于较小的矩阵,库开销变得更加重要。

由于数组访问的开销,纯 Java 库比高度优化的 c 库慢,即使算法完全相同。一些库通过调用本机代码来解决这个问题。你可能想看看

http://code.google.com/p/matrix-toolkits-java/

正是这样做的。将内存从 java 复制到本机库会产生一些开销,但对于大型矩阵来说,这是微不足道的。

有关纯 Java 性能的基准(我正在研究的),请查看:

http://code.google.com/p/java-matrix-benchmark/

另一个基准测试在这里:

http://www.ujmp.org/java-matrix/benchmark/

这些基准中的任何一个都可以让您对大型矩阵的性能有一个很好的了解。

【讨论】:

  • 我为你修复了链接,现在你有超过 10 个代表,你应该不会再遇到任何问题,在你的答案中发布超过 1 个链接。 =)
【解决方案2】:

Colt 可能是最快的。

“Colt 为 Java 中的高性能科学和技术计算提供了一组开源库。” “例如,IBM Watson 的 Ninja 项目表明,Java 执行 BLAS 矩阵计算的速度确实可以达到优化后的 Fortran 的 90%。 "

JAMA!

“JAMA 是 Java 的基本线性代数包。它提供了用于构造和操作真实密集矩阵的用户级类。”

或者Efficient Java Matrix Library

“Efficient Java Matrix Library (EJML) 是一个用于操作稠密矩阵的线性代数库。它的设计目标是:1) 对小型和大型矩阵都尽可能地高效计算,以及 2) 两者都可以访问新手和专家。”

【讨论】:

  • 谢谢。你知道他们是如何实现效率的吗?我的意思是代码中发生了什么,因为如果我要编写 matlab 或 JAMA 之类的东西,除了运行超慢循环之外,我想不出一种方法来更新整个矩阵。
  • 从 Colt 页面中,他们注意到它结合了算法选择和数据结构。他们在其发行版中提供源代码。你可以去看看。
  • 我只是推测,但他们应该以某种方式利用打包指令(也称为 SIMD)来实现一些并行性。例如:en.wikipedia.org/wiki/Streaming_SIMD_Extensions#Example
  • 查看这篇博文“性能缓存局部性”blogs.microsoft.co.il/blogs/pavely/archive/2009/06/22/…