【问题标题】:Why does Breeze use Array to represent a matrix?为什么 Breeze 使用 Array 来表示矩阵?
【发布时间】:2017-01-21 04:11:44
【问题描述】:

DenseMatrix 类有一个 Array[V] 类型的参数数据。为什么不使用其他可以动态增长的可变集合,例如 Vector?

【问题讨论】:

  • 只是猜测:可能是因为与本机库 (JNI) 的通信必须使用数组完成,AFAIK 你不能将任意集合传递给本机代码。
  • 也可能是因为数组是最快的。为什么矩阵需要动态增长?矩阵不是总是有固定的尺寸吗?
  • @Raphael Roth 谢谢你的回复,你能指出一些与JNI通信的DenseMatrix方法吗?
  • @Jasper-M 你不能说数组在所有操作中都更快。例如,如何将列附加到由数组表示的矩阵?您必须创建一个新的,因此需要元素数量的线性时间。如果它是一个向量,那么 append 将花费一个常数时间(与一列中的元素数成线性关系)。

标签: scala immutability scala-breeze


【解决方案1】:

cmets(来自 Raphael Roth 和 Jasper-M)都提出了很好的观点,他们都是原因的一部分。 Breeze 使用 netlib-java 通过 JNI 处理其与本机 BLAS 的接口,它使用数组。 (它本来可以用 Java Buffers 来实现,但他们没有。)动态调整 DenseMatrices 的大小没有多大意义,DM 和 DV 的实现是故意相似的。

与 Java 和 Scala 中的任何其他内置的类似集合的东西相比,数组还具有更好的性能特征,并且由于 Breeze 关心速度,因此它是最佳选择。 scala 和 java box 原始元素中的所有通用集合,这在性能敏感的环境中是完全不可接受的。 (我本可以使用 Scala 的专用来滚动我自己的专用 ArrayBuffer,但我没有。)此外,java Vector 会同步所有访问,因此除非您确实需要锁定,否则它特别不可接受。

如果您不确定数据集的维度,可以使用 VectorBuilder(它有一个可设置的长度参数,并且可以设置为 -1 以关闭边界检查)。

【讨论】:

  • 感谢您的详细解答。我检查了你的解释,现在我明白了选择 Array 的原因(虽然对 netlib-java 不是很熟悉。这个库似乎比我想象的还要棒。
猜你喜欢
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2022-01-20
  • 1970-01-01
  • 2020-04-14
相关资源
最近更新 更多